范围或实例变量

问题描述 投票:0回答:1

根据我在Rails中使用范围所读的内容,因为您直接查询模型,而不是通过控制器到达模型的实例变量(这就是我的看法?),效率更高。

所以我在控制器中有此查询

@animal_location = User.select(:town).map(&:town).uniq
["Cardiff", "Newport"]

然后是我模型中的这个范围

scope :uniq_towns, ->() {
 select("town").group("town")
}
#<ActiveRecord::Relation [#<User id: nil, town: "Cardiff">, #<User id: nil, town: "Newport">]>

我认为可以使用@animal_location = User.select(:town).map(&:town).uniq来访问城镇值,我可以像]一样进行访问>

<% @animal_location.each do |loc| %>
  <%= loc %>
<% end %>

或者如果我使用示波器并使用@animal_location = User.uniq_towns,我认为我会使用

<% @animal_location.each do |loc| %>
  <%= loc.town %>
<% end %>

我的第一个问题是,在这种情况下,我的范围会更快吗?其次,当我获得用户ID:nil作为哈希的一部分时,我的范围是否正确?>

谢谢

根据我在Rails中使用范围所读的内容,效率更高,因为您直接查询模型,而不是通过控制器到达模型的实例变量(这就是我的看法?)...

ruby-on-rails activerecord ruby-on-rails-4 named-scope
1个回答
3
投票

这取决于您的来源所指的“有效”。范围的目的是使代码保持DRY(“不要重复自己”),并为ActiveRecord(AR)查询实现“提取方法”重构模式。它们易于维护。

为什么使用它?如果您在多个地方使用相同的查询,请考虑需要在任何地方进行更改的情况。您必须查找并替换所有出现的事件。这种方式容易出错,并且会导致版本控制中出现更多差异,而这些差异很难跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.