2011-01-14 78 views
28

我已經在過去設置了這個HABTM關係,並且之前工作過....現在它不是,我在我的智慧最終試圖找出什麼是錯的。我一整天都在看導軌指南,而且似乎無法弄清楚我做錯了什麼,所以幫助真的很感激。Rails - HABTM關係 - 如何根據關聯模型的屬性查找記錄

我有2個模型通過連接模型連接,我試圖找到基於關聯模型的屬性的記錄。

Event.rb

has_and_belongs_to_many :interests 

Interest.rb

has_and_belongs_to_many :events 

,那就是像

create_table 'events_interests', :id => false do |t| 
     t.column :event_id, :integer 
     t.column :interest_id, :integer 
    end 

我試圖

@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ]) 
創建一個連接表遷移3210

但得到了錯誤「沒有找到名爲'interest'的協會;也許你拼錯了它「......這我沒有,當然

我試圖

@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ]) 

,但得到的錯誤」未定義的方法'利益的#Class:0x4383348"

我怎麼能發現有4感興趣ID的活動....我肯定從這個笑

回答

67

您需要包括利益表禿頂。

@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4]) 

你在你的文章中是正確的,但你沒有將興趣複數化。

更新

因爲這個答案還是越來越關注,我想這可能是使用ActiveRecord::Relation語法,因爲上面的方法將被棄用更新是個好主意。

@events = Event.includes(:interests).where(interests: { id: 4 }) 

@events = Event.includes(:interests).where('interests.id' => 4) 
5

答案是有幫助的,謝謝!我知道這篇文章很舊,但我想出了一個可能對某人有用的不同解決方案。我注意到查詢生成在我的情況下是相當長的。對我來說,與您的「興趣」表格相等的表格中有很多列和數據。爲了避免搜索表匹配的ID,我的解決方案看起來與此類似:

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 

這爲我工作,因爲我已經與IDS的事件列表中的實例化對象@interest。當然,你並沒有使用軌道可用的一些魔術。此外,我無法讓您的解決方案與「不」合作。例如;

@events = Event.includes(:interests).where.not(interests: { id: 4 }) 

不起作用。它會返回0結果。但是這個:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 

會工作,這將返回所有與@interest沒有關聯的事件。

相關問題