2013-02-18 33 views
0

我正在使用Ruby on Rails應用程序,該應用程序已使用pg_search和模型上的其他兩個字段進行文本搜索。該邏輯根據搜索結果創建一個「數組」行。我不記得這個的實際名稱,因爲從技術上講,這不是一個數組。它是選定行的實例變量。我想從兩個附加模型中添加搜索條件。我的數據庫是PostgreSQL。如何在Ruby on Rails中使用三個表的聯接?

下面是三個模型定義的一個子集:

MediaLibrary:姓名,media_creator_id,media_type_id(即在當前的搜索所用的字段;有許多media_topics,有許多media_targets)

MediaTopic:media_library_id ,topic_id(要搜索topic_id;屬於media_library;正在搜索的topic_id來自主題模型(id,name))

MediaTarget:media_library_id,target_id(要搜索target_id;屬於media_library; target_id正在搜索來自Target模型( ID,名稱))

我在想,如果主題和目標都與其他三個搜索條件一起搜索,我應該可以做這樣的事情。我還需要在我的結果中有topic_id和target_id,這樣我才能在我的視圖中顯示Topic.name和Target.name。

@media_libraries = MediaLibrary.text_search(params[:query]).where("media_creator_id = ? AND media_type_id = ?", params[:media_creator_id].to_i, params[:media_type_id].to_i).joins(:media_topics.where("media_library_id = ? and topic_id = ?", id_from_media_library_row, params[:topic_id].to_i).joins(:media_targets.where("media_library_id = ? and target_id = ?", id_from_media_library_row, params[:target_id].to_i) 

我已經搜查postgresql.org和堆棧溢出,但沒有發現任何加入上被人回答了Rails的使用Ruby三個表。

回答

0

您可以將SQL連接語句傳遞到#joins。我不確定你的情況會如何,但你可以做類似的事情:

@media_libraries = MediaLibrary.joins(%q(
    JOIN media_targets 
    ON media_targets.media_library_id = media_libraries.id 
    JOIN media_topics 
    ON media_topics.media_library_id = media_libraries.id 
)).text_search(params[:query]) 
    .where(
    media_libraries: { 
     media_creator_id: params[:media_creator_id], 
     media_type_id: params[:media_type_id] 
    }, 
    media_topics: { id: params[:topic_id] }, 
) 
+0

謝恩,非常感謝。我花了一段時間來編寫所有條件。我還爲media_targets和media_topics中的字段添加了索引。我仍在測試所有的條件,並發現了一些我需要修改的地方。這正是我需要的! – 2013-02-20 12:06:27