将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上使用的正确语法是什么?
答案 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
集合对象,因此您可以在需要时将其与其他作用域安全地链接。