2016-10-21 20 views
6

У меня есть область, которая возвращает Array вместо ActiveRecord Relation, когда она вызывается, но если я вызову методы в пределах области действия, она вернет ActiveRecord Relation.Область действия ActiveRecord возвращает массив

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

вы можете проверить его с помощью метода класса вместо объема ...? – uzaif

+0

Вы взглянули на этот ответ, чтобы узнать, является ли это той же причиной? http://stackoverflow.com/a/7901640/3366016 – user3366016

ответ

0

Объект действительно возвращает объект отношения, однако он, при необходимости, преобразует его, когда вы запустите область в консоли, она попытается проверить ее и будет выполнять преобразование.

Но попробовать это, он должен работать:

scope = Model.beta_user 

# pluck should work 
scope.pluck(:id) 

и все другие методы, такие как first, last, countall, и т.д ... должны работать

Смежные вопросы