ActiveRecord范围返回一个数组

时间:2016-10-21 19:51:35

标签: ruby-on-rails activerecord

我有一个范围在调用时返回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'")不执行查询。我认为范围不应该执行,直到它需要为链式范围/查询进行优化。

1 个答案:

答案 0 :(得分:0)

范围确实会返回一个关系对象,但是在必要时它会转换它,当你在控制台中运行范围时,它会尝试检查它并进行转换。

但试试这个,它应该有效:

scope = Model.beta_user

# pluck should work
scope.pluck(:id)

所有其他方法,例如firstlastcountall等......应该有效