我的模型Note
has_and_belongs_to_many:
Tags
。
我想查找至少包含ID 1
和2
两个标记的所有Notes。
目前,我有这个:
Note.includes(:tags).where(tags: { id: [1,2] }).references(:tags)
这将返回所有标记为EITHER ID Notes
或1
的{{1}}。
我想要返回任何包含两个标签的音符。它不仅可以包含这两个标签,而且至少必须同时包含这两个标签。
有什么想法?我正在使用Rails 4。
答案 0 :(得分:1)
我从来没有找到一个好的解决方案。但我正在分享我的解决方案,以防你找不到好的解决方案。你可以这样做,
Note.includes(:tags).where(tags: { id: 1 }).references(:tags) && Note.includes(:tags).where(tags: { id: 2 }).references(:tags)
令人惊讶的是它只需要一个SQL查询并且它可以工作。您可以编写一个方法,根据您的数组生成这样的链,然后使用eval
来执行。
答案 1 :(得分:0)
可以尝试在where call中使用SQL语法吗?
可能是这样的:
Note.includes(:tags).where('EXISTS(SELECT 1 from tags where id = 1 and note_id = notes.id) and EXISTS(select 1 from tags where id = 2 and note_id = notes.id)').references(:tags).uniq
答案 2 :(得分:0)
你可以链接2轮
.where(tags: { id: 1 }).where(tags: { id: 2 })
答案 3 :(得分:0)
你可以非常轻松地将标签链接到标签。
Note.includes(:tags).where(tags: { id: 1 }).where(tags: { id: 2 }).references(:tags)