我正在开发一个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加入三个表,任何人都可以回答。
答案 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] },
)