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
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 })
^ ^