我有一个范围在调用时返回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
所以我的问题是,回复类型不一致的是什么?我之后无法链接其他范围(我仍然可以在它之前链接它们)而且我无法使用其他AR Relation
方法,例如#order
和#pluck
。
从我在控制台中看到的内容,似乎调用Model.beta_user.class
仍在执行查询,而Model.joins(:config).where("config_type = 'Model' AND opts #>> '{beta}' = 'true'")
不执行查询。我认为范围不应该执行,直到它需要为链式范围/查询进行优化。
答案 0 :(得分:0)
范围确实会返回一个关系对象,但是在必要时它会转换它,当你在控制台中运行范围时,它会尝试检查它并进行转换。
但试试这个,它应该有效:
scope = Model.beta_user
# pluck should work
scope.pluck(:id)
所有其他方法,例如first
,last
,count
,all
等......应该有效