2012-10-09 33 views
0

我有一個模型「Events」,每個事件包含一個「Genre」(不同模型)的ID數組。當我創建一個事件時,我檢查了一堆盒子並將檢查過的類型保存到數據庫中。這一切工作正常。Ruby on Rails - 檢索ID數組並使用該數組查詢不同的模型

當我運行循環顯示所有事件時,字段genre_ids會返回一個數組,其中包含每個所選流派的id,需要從genres表中檢索。

我嘗試了一些我發現但尚未成功的建議。

類型模型:

class Genre < ActiveRecord::Base 
    has_and_belongs_to_many :events 
end 

事件模型:

class Event < ActiveRecord::Base 
    belongs_to :user 
    has_many :genres 
end 

活動控制器:

class EventsController < ApplicationController 

    def index 
    @event_all = Event.all 
    end 

def get_genres(event_id) 
    @event_genre = Event.find(event_id).genre_id 
end 
helper_method :get_genres 

end 

------- 

最後的循環:

<div id="index-events-wrap"> 
    <% @event_all.each do |ea| %> 
    <div class="item"> 
    <div class="event-image"> 
     image here 
    </div> 
    <ul> 
     <li><%= ea.name %></li> 
     <li><%= get_genres(ea.id) %></li> 
     <li><%= ea.venue_name %></li> 
     <li><%= ea.venue_address %></li> 
     <li><%= ea.venue_postcode %></li> 
    </ul> 
    </div> 
<% end %> 
</div> 

回答

3

嘗試:

@event_all = Event.includes(:genres).all 

它將使一個多個查詢(避免類型實例的多個實例),並自動填充所有關聯。因此,在視圖中,您可以:

<li><%= ea.genres %></li> 

順便說一句,你應該有這兩類has_and_belongs_to_many,否則Rails會不明白。

class Event < ActiveRecord::Base 
    belongs_to :user 
    has_and_belongs_to_many :genres # <- this one 
end 

如果需要,添加一個遷移的連接表,見Do I need to manually create a migration for a HABTM join table?

+2

+1,我正準備回答同樣的事情。你也應該避免使用'.all'(一開始工作正常,但想象一下,有十億個事件......)。使用'.limit',或類似[will_paginate](https://github.com/mislav/will_paginate/)/ [kaminari](https://github.com/amatsuda/kaminari) –

+0

感謝您的幫助球員: ) –

+0

我明白你對.all的意思。這是暫時的,因爲當我實現它一個預期,它不會被。所有,但基於事件日期:)現在我只是想獲得的所有屏幕上的..謝謝了一堆 –