模型具有所有关联的Rails

时间:2016-06-27 03:51:42

标签: ruby-on-rails activerecord

我的模型Note has_and_belongs_to_many: Tags

我想查找至少包含ID 12两个标记的所有Notes。

目前,我有这个:

Note.includes(:tags).where(tags: { id: [1,2] }).references(:tags)

这将返回所有标记为EITHER ID Notes1的{​​{1}}。

我想要返回任何包含两个标签的音符。它不仅可以包含这两个标签,而且至少必须同时包含这两个标签。

有什么想法?我正在使用Rails 4。

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)