如何在Ruby on Rails中使用三个表的连接?

时间:2013-02-18 22:55:03

标签: ruby-on-rails postgresql join pg-search

我正在开发一个Ruby on Rails应用程序,该应用程序已经具有使用pg_search和模型上的其他两个字段进行文本搜索的逻辑。逻辑从搜索结果中创建行的“数组”。我不记得这个的实际名称,因为从技术上讲这不是一个数组。它是所选行的实例变量。我想从另外两个模型中添加搜索条件。我的数据库是PostgreSQL。

以下是所有三种模型定义的子集:

MediaLibrary:name,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,name))

我认为如果同时搜索主题和目标以及其他三个搜索条件,我应该可以做这样的事情。我还需要在我的结果中使用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和Stack Overflow上搜索过,但是没有发现任何人使用Ruby on Rails加入三个表,任何人都可以回答。

1 个答案:

答案 0 :(得分: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] },
  )