Ruby on rails 检索不包含';在ActiveRecord/Rails中没有关系

Ruby on rails 检索不包含';在ActiveRecord/Rails中没有关系,ruby-on-rails,activerecord,ruby-on-rails-3.2,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Activerecord,Ruby On Rails 3.2,Ruby On Rails 4,Rails Activerecord,我需要从我的数据库中获取所有非工作人员的用户: class User < ActiveRecord::Base has_one :staff def is_staff? staff != nil end end class Staff < ActiveRecord::Base attr_accessible :user_id belongs_to :user end 这似乎是可行的,但我希望在数据库中有这个逻辑,并且在尝试以这种方式排序时,由于某种原因,

我需要从我的数据库中获取所有非工作人员的用户:

class User < ActiveRecord::Base
  has_one :staff
  def is_staff?
    staff != nil
  end
end
class Staff < ActiveRecord::Base
  attr_accessible :user_id
  belongs_to :user
end
这似乎是可行的,但我希望在数据库中有这个逻辑,并且在尝试以这种方式排序时,由于某种原因,我在Heroku的生产中遇到了一个错误(使用sqlite的开发人员没有给我这个错误):

无论如何,如果我想获得所有员工用户,这似乎很简单:

User.joins(:staff)
有没有一种简单的方法来获取非员工用户?也许是这样的

User.not_joins(:staff)
实际上,我需要用户不是员工或管理员:

User.not_joins(:staff, :admin)
您有3种解决方案:

  • 做一些没有优化和肮脏的事情,比如:

    User.where('id NOT IN(?)', Staff.select(:user_id).all.map(&:user_id).uniq).all
    
或者像Yoshiji先生说的那样

    User.includes(:staff).where(:staff => {:id => nil})
  • 为表用户添加一个字段,以了解用户是否有职员,因此在为用户创建职员后,必须将此字段设置为true,但您可以轻松获得所有用户

    User.where(:have_staff => false).all
    
  • 或者你颠倒你的关系,说Staff有一个用户,用户属于Staff,而对于get all用户,你可以这样做

    User.where(:staff_id => nil).all
    

要获取所有与员工无关的用户,您可以使用以下方法:

User.includes(:staff).where(staff: { id: nil }) 
对于以下查询“Get all Staff have no user associated”(获取没有用户关联的所有员工),其工作方式与此相同:


需要知道的事情:
包含
(和
预加载
连接
)方法中,您必须使用模型中定义的关系名称(
属于
有一个
:singularize,
有多个
:pluralize),但是在where子句中,您必须使用关系的复数版本(实际上是表的名称)。

使用
User.includes(:staff).where(staff:{id:nil})
来获取所有没有关联staff的用户(您可能必须将WAR子句中的staff关系重命名为复数版本)@MrYoshiji-很有趣,所以
包括
非员工用户,而
加入
则不包括。谢谢,当你使用includes和where中的includes时,你应该把它作为一个答案,你做一个左连接,而连接做一个内部连接。谢谢。我喜欢@MrYoshiji的答案,最后两个选项在我的情况下是不可能的
User.where(:have_staff => false).all
User.where(:staff_id => nil).all
User.includes(:staff).where(staff: { id: nil }) 
Staff.includes(:user).where(users: { id: nil })
                   ^            ^