包含失败的Rails 4.1范围因未知列而失败

时间:2018-09-26 08:55:06

标签: ruby-on-rails-4 scope

将Rails 4.0升级到4.1后,以下代码打破了说法

Mysql2::Error: Unknown column 'user_groups.id' in 'where clause

scope :check_access, lambda {|user| includes(:user_groups).where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids) if user}

上面在rails 4.1上使用的正确语法是什么?

1 个答案:

答案 0 :(得分:2)

includes不再保证源表和包含的关系之间的连接。 Rails可以决定使用联接或通过两个单独的查询来预加载关联的信息。

除了includes之外,您还应该添加一个references(:user_groups)子句,该子句将为ActiveRecord提供足够的信息以了解您的意图。

scope :check_access, lambda { |user| 
  includes(:user_groups).references(:user_groups).where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids) if user
}

请注意,如果存在用户记录,则构造将返回ActiveRecord关系,否则将返回nil。您最好使用.none方法来返回一个空集合:

scope :check_access, lambda { |user|
  if user
    includes(:user_groups)
      .references(:user_groups)
      .where('restrict_access is false or user_groups.id in (?)', user.get_user_group_ids)
  else
    none
  end
}

这样,check_access始终返回一个ActiveRecord::Relation集合对象,因此您可以在需要时将其与其他作用域安全地链接。