0

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

这是所有三个模型定义的子集:

MediaLibrary:名称、media_creator_id、media_type_id(当前搜索中使用的字段;有很多 media_topics 和很多 media_targets)

MediaTopic:media_library_id,topic_id(要搜索topic_id;属于media_library;正在搜索的topic_id来自一个Topic模型(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 连接三个表的任何内容。

4

1 回答 1

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] },
  )
于 2013-02-18T23:42:06.230 回答