【发布时间】:2013-08-14 21:40:59
【问题描述】:
我需要从我的数据库中获取所有非员工用户:
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
所以我可以在代码中做到这一点:
User.all.select {|user| not user.is_staff? }
这似乎可行,但我想在数据库中有这个逻辑,而且我在尝试以这种方式排序时由于某种原因在使用 Heroku 的生产中出错(使用 sqlite 的开发人员不会给我这个错误) :
NAME_SORT = ->(a, b) {
if a.first_name == b.first_name
a.last_name <=> b.last_name
else
a.first_name <=> b.first_name
end
}
User.all.select {|user| not user.is_staff? }.sort &NAME_SORT
由于某种原因我得到的错误是:
ArgumentError: comparison of User with User failed
无论如何,如果我想获得所有员工用户,这似乎很简单:
User.joins(:staff)
有没有一种简单的方法可以吸引非员工用户?也许是这样的?
User.not_joins(:staff)
而且我真的需要用户不是员工或管理员:
User.not_joins(:staff, :admin)
【问题讨论】:
-
使用
User.includes(:staff).where(staff: {id: nil})获取所有没有人员关联的用户(您可能需要将 were 子句中的人员关系重命名为其复数版本) -
@MrYoshiji - 很有趣,所以
includes包括非员工用户,而joins不包括。谢谢,你应该把这个作为答案 -
当您使用包含并使用您在 where 中包含的内容时,您执行 LEFT JOIN,而连接执行 INNER JOIN。
标签: ruby-on-rails activerecord ruby-on-rails-3.2 ruby-on-rails-4 rails-activerecord