Ruby on Rails 3:如何在has_many查询中访问每条记录的属性

问题描述:

我不确定如何在标题中使用短语,但我正在尝试执行以下操作。我有2种型号有以下关系:Ruby on Rails 3:如何在has_many查询中访问每条记录的属性

class Campaign < ActiveRecord::Base 
    has_many :points 
end 

class Point < ActiveRecord::Base 
    belongs_to :campaign 
end 

现在,点模型具有“区域设置”属性,我希望能够把特定活动的每一个点的所有的“语言环境”为阵列,或收藏,或什么,而不必像做

locales = Array.new 
campaign.points.each do |p| 
    locales << p.locale 
end 

我在想沿campaign.points.locales线的东西。有没有一些好的Rails做这个查询的方法,或者我只需要遍历集合?

感谢您的任何帮助。

编辑:也因为关系实际上是一个“has_many通过”的关系,这种方法不起作用,因为我得到许多重复的区域设置,如果我尝试迭代以这种简单的方式。这听起来应该是某种类型的连接,但我不确定。

campaign.points.map {|p| p.locale} 

应该这样做。

+0

+1对于一个有价值的答案;) – apneadiving

+0

优秀!正是我在找什么。谢谢! –

我会怎么做:

campaign.points.map(&:locale) 
+0

我不知道为什么我倾向于忘记提示这个很好的语法,我一直都在使用它。 Bah :) – lucapette

+0

如果有人想知道这意味着什么:[Ruby/Ruby on Rails&符号冒号捷径](http://*.com/questions/1961030/ruby-ruby-on-rails-ampersand-colon-shortcut ) – slhck

+0

l33t从这个语法中渗透出来,融化了它所有的pythonistas。 – jimworm

你可以做那些家伙说。将.uniq放在最后,并以正确的解决方案结束,或者;

让我把你带入ActiveRecord乐趣迷失(可能失败,因为我无法测试,看看它是否在这里工作)。但是你可以像你想的那样运行campaign.points.locales

class Campaign < ActiveRecord::Base 
    has_many :points do 
    def locales 
     select('DISTINCT(locale)').map(&:locale) 
    end 
    end 
end 
+0

'.uniq'为重复项目做了诀窍。非常感谢你! –

+0

在此期间离开阅读文档...噢,我希望你会尝试AR解决方案,以便我可以看到它是否工作。我向你保证时间和空间的好处(因为它只从db中加载不同记录中的locale列)! – jimworm