Ruby on rails 4 包含的Rails 4.1作用域失败,列未知
在将rails 4.0升级到4.1之后,下面的代码是Ruby on rails 4 包含的Rails 4.1作用域失败,列未知,ruby-on-rails-4,scope,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} 对于rai
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,上面使用的正确语法是什么?
includes
不再保证源表和包含关系之间的连接。Rails可能决定使用连接或通过两个单独的查询预加载相关信息
除了includes
,您还应该添加references(:user\u 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\u access
将始终返回一个ActiveRecord::Relation
集合对象,因此,如果需要,您可以安全地将其与其他作用域链接。includes
不再保证源表和包含的关系之间的连接。Rails可能决定使用连接或通过两个单独的查询预加载相关信息
除了includes
,您还应该添加references(:user\u 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\u access
将始终返回一个ActiveRecord::Relation
集合对象,因此如果需要,您可以安全地将其与其他作用域链接。每个人都是不同的,但在我的团队中,如果作用域变得如此之大,我们将把它转换为类方法。我的也是!不过,我不想在这里对范围
的定义做太大的修改,以使建议的代码尽可能接近原始代码,这样Rails的新用户就有更好的机会跟进。我认为您处理得很好,没有离OP的问题太远。我只是想提出我的建议。你的应该是选择的答案。每个人都是不同的,但在我的团队中,如果一个作用域变得这么大,我们将把它变成一个类方法。我的也是!不过,我不想在这里对范围
的定义做太大的修改,以使建议的代码尽可能接近原始代码,这样Rails的新用户就有更好的机会跟进。我认为您处理得很好,没有离OP的问题太远。我只是想提出我的建议。您的答案应该是选定的答案。