2010-02-15 93 views
0

我有3個數據表和2個Join表連接所有內容。我試圖找出一種方法來查詢結果基於連接表數據是相同的條件。Rails - 從兩個連接表中查找結果

爲了解釋,我有用戶,興趣和事件表。這些表通過HABTM關係鏈接(這對我的需求很好,因爲我不需要存儲任何其他字段)並通過兩個連接表進行連接。所以我也有一個UsersInterests表(user_id,interest_id)和一個EventsInterests表(event_id,interest_id)。

當試圖查詢用戶興趣符合事件興趣的所有事件時,問題就出現了。

我認爲這將是這個樣子......

@events= Event.find(:all, :conditions => [@user.interests = @event.interests]) 

,但我得到的錯誤 「未定義的方法`的零興趣:NilClass」,是不是有什麼毛病我的語法或我的邏輯?

+0

您能否爲此操作控制器顯示整個方法? – 2010-02-15 02:57:24

回答

1

你的問題是@user或@event是未定義的。即使您定義它們,在執行此語句之前,所提供的條件選項也是無效的,[@user.interests = @event.interests]

的事件,則此命名範圍應該做的伎倆

class Event < ActiveRecord::Base 
    ... 
    named_scope :shares_interest_with_user, lambda {|user| 
    { :joins => "LEFT JOIN events_interests ei ON ei.event_id = events.id " + 
     "LEFT JOIN users_intersets ui ON ui.interest_id = ei.interest_id", 
     :conditions => ["ui.user_id = ?", user], :group_by => "events.id" 
    } 
end 

@events = Event.shares_interest_with_user(@user) 
+0

所以要在控制器中調用它看起來像「@Events = Event.shares_interest_with_user」? – ChrisWesAllen 2010-02-15 15:57:24

+0

命名的作用域效果很好,非常感謝。我在最後一個條件中遇到了一個小問題,它不允許我使用[「ui.user_id =?」,用戶],任何想法爲什麼會拋出一個錯誤? – ChrisWesAllen 2010-02-19 14:39:29

+0

你得到的錯誤是什麼? – EmFi 2010-02-19 17:30:34

0

鑑於Event <-> Interest <-> User查詢所有地方的用戶興趣相匹配的事件利益(所以下面會發現所有這些活動,本次活動的興趣也在利益的活動的至少一個用戶)。

先試試,可以工作的最簡單的事情:

@events = [] 
Interest.all.each do |i| 
    i.events.each do |e| 
    @events << e if i.users.any? 
    end 
end 
@events.uniq! 

效率非常低,非常耗資源和CPU密集型。生成大量的SQL查詢。但完成工作。

第二次嘗試應該包含一些複雜的連接,但我越想越多,我越看清你的問題是多麼模糊。更精確。

0

不知道我完全按照你所要做的。如果你有一個用戶,並且你想要那個用戶也有興趣的所有事件,然後像這樣:

Event.find(:all, :include => [:events_interests], :conditions => ['events_interests.interest_id in (?)', @user.interests.collect(&:id)]) 

應該可能工作。

相關問題