Jef*_*eff 6 activerecord ruby-on-rails
我有一个范围,它返回一个Array而不是一个ActiveRecord Relation调用它,但如果我调用范围内的方法,它返回一个ActiveRecord Relation.
scope :beta_user, -> {
joins(:config).where("config_type = 'Model' AND opts #>> '{beta}' = 'true'")
}
# Calling scope directly
Model.beta_user # => [Model1, Model2, Model3]
Model.beta_user.class # => Array
# Calling scope definition
Model.joins(:config).where("config_type = 'Model' AND opts #>> '{beta}' = 'true'")
=> [Model1, Model2, Model3]
Model.joins(:config).where("config_type = 'Model' AND opts #>> '{beta}' = 'true'").class
=> Model::ActiveRecord_Relation
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,不一致的返回类型会发生什么?在此之后我无法链接其他范围(我仍然可以在它之前链接它们)并且我不能使用其他AR Relation方法,例如#order和#pluck.
从我在控制台中可以看到,似乎调用Model.beta_user.class仍在执行查询,Model.joins(:config).where("config_type = 'Model' AND opts #>> '{beta}' = 'true'")而不执行查询.我认为范围不应该执行,直到它需要为链式范围/查询进行优化.
作用域确实返回一个关系对象,但是它会在必要时转换它,当您在控制台中运行作用域时,它会尝试检查它并进行转换。
但试试这个,它应该有效:
scope = Model.beta_user
# pluck should work
scope.pluck(:id)
Run Code Online (Sandbox Code Playgroud)
所有其他方法如first、last、count、all等......应该有效
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |