2011-09-30 86 views
4

我不確定如何在標題中使用短語,但我正在嘗試執行以下操作。我有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通過」的關係,這種方法不起作用,因爲我得到許多重複的區域設置,如果我嘗試迭代以這種簡單的方式。這聽起來應該是某種類型的連接,但我不確定。

回答

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

應該這樣做。

+0

+1對於一個有價值的答案;) – apneadiving

+0

優秀!正是我在找什麼。謝謝! –

7

我會怎麼做:

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

我不知道爲什麼我傾向於忘記提示這個很好的語法,我一直都在使用它。 Bah :) – lucapette

+0

如果有人想知道這意味着什麼:[Ruby/Ruby on Rails&符號冒號捷徑](http://stackoverflow.com/questions/1961030/ruby-ruby-on-rails-ampersand-colon-shortcut ) – slhck

+0

l33t從這個語法中滲透出來,融化了它所有的pythonistas。 – jimworm

1

你可以做那些傢伙說。將.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

相關問題