[英]ActiveRecord scope returns an array
我有一個范圍,在調用它時返回一個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'")
不執行查詢。 我認為范圍不應該執行,直到它需要為鏈式范圍/查詢進行優化。
范圍確實返回一個關系對象,但是它會在必要時轉換它,當你在控制台中運行范圍時,它會嘗試檢查它並進行轉換。
但試試這個,它應該工作:
scope = Model.beta_user
# pluck should work
scope.pluck(:id)
所有其他方法,如first
, last
, count
, all
等......應該可行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.