ruby-on-rails - 检索在 ActiveRecord/Rails 中没有关系的对象

标签 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

所以我可以用代码来做到这一点:

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

对于以下查询“获取所有没有关联用户的员工”,它的工作方式相同:

Staff.includes(:user).where(users: { id: nil })
                   ^            ^

须知:在includes(以及preloadjoins)方法中,您必须使用模型中定义的关系名称(belongs_to & has_one:单数,has_many:复数),在where 子句必须使用关系的复数形式(实际上是表的名称)。

关于ruby-on-rails - 检索在 ActiveRecord/Rails 中没有关系的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18242798/

相关文章:

ruby-on-rails - 在嵌入式 ruby​​ 中指定 link_to 的类

ruby-on-rails-3 - 如何在 Rails 3.2.3 中激活记录缓存

internationalization - Rails 3 View 中的 i18n Markdown 文件

ruby-on-rails - 路由文件有多灵活

javascript - 按钮设置为禁用,但我仍然可以单击它

ruby-on-rails - FactoryGirl 没有给出有用的验证错误

css - 移动前端有一个错误 : container is not fixed

ruby-on-rails - Rails render_to_string

ruby-on-rails - 获取按唯一字段值分组的最新行

ruby-on-rails - 如何测试carrierwave文件是否更改?