2013-08-08 19 views
5

mam następujące modele utworzone z aktywnego rekordu 4 (mapowanie bazy danych starszego typu)Pętla przez ActiveRecord :: Associations :: CollectionProxy ze sobą

class Page < ActiveRecord::Base 
    self.table_name = "page" 
    self.primary_key = "page_id" 
    has_many :content, foreign_key: 'content_page_id', class_name: 'PageContent' 
end 

class PageContent < ActiveRecord::Base 
    self.table_name = "page_content" 
    self.primary_key = "content_id" 
    belongs_to :pages, foreign_key: 'page_id', class_name: 'Page' 
end 

Poniższy działa prawidłowo ....

page = Page.first 
page.content.first.content_id 
=> 17 
page.content.second.content_id 
=> 18 

jednak chcę, aby być w stanie pętli choć wszystkie elementy podobnie jak

page.content.each do |item| 
    item.content_id 
end 

ale to po prostu zwraca whol e zbiór nie pole indywidualne

=> [#<PageContent content_id: 17, content_text: 'hello', content_order: 1>, #<PageContent content_id: 18, content_text: 'world', content_order: 2>] 

pojawia Jest to ActiveRecord :: Związki :: CollectionProxy

page.content.class 
=> ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_PageContent 

ktoś ma jakieś pomysły?

okrzyki

Odpowiedz

14

Prawdopodobnie chcesz użyć map zamiast:

page.content.map do |item| 
    item.content_id 
end 

map (aka collect) będzie iterację tablicy i uruchomić niezależnie od kodu poprosić go na członków tablicy, jeden o jeden. Zwróci nową tablicę zawierającą zwracane wartości dla tych wywołań metod.

+1

Dlaczego zatem page.content.each nie działa? – MSC

+1

@MSC Nie zadziała w tym przypadku, ponieważ OP chce zwrócić wyniki połączenia wewnątrz bloku. "każdy" nie zrobiłby tego. –