ActiveRecord范围返回一个数组

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'")而不执行查询.我认为范围不应该执行,直到它需要为链式范围/查询进行优化.

Sso*_*esS 0

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

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

scope = Model.beta_user

# pluck should work
scope.pluck(:id)
Run Code Online (Sandbox Code Playgroud)

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