Rails-запрос с несколькими вложенными атрибутами - PullRequest
0 голосов
/ 26 июня 2018

У меня есть две модели в моем приложении 5 рельсов:

class Post < ApplicationRecord
  has_many :tags
end

class Tag < ApplicationRecord
  belongs_to :post
end

В моей базе данных, например, два поста с двумя разными тегами. Как я могу найти в своем сообщении два специальных тега (tag.title = "tagname1" И tag.title = "tagname2"):

Post.includes(:tags).where(tag: {title: "tagName1"}).where(tag: {title: 
"tagName2"})

спасибо

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вы можете использовать arel для более чистых запросов.

Post.joins(:tags).where(Tag.arel_table[:title].in(['tagName1', 'tagName']))
0 голосов
/ 26 июня 2018

Решение

Post.joins(:tags)
  .where(tags: { title: ['tag1', 'tag2'] })
  .group('posts.id')
  .having('count(tags.post_id) = ?', 2)

Предположения:

  • у вас есть проверка уникальности tag.title для каждого сообщения, как показано ниже:

    class Tag < ApplicationRecord
      belongs_to :post
    
      validates :title, uniqueness: { scope: :post }
    end
    

    ... в противном случае решение выше не будет работать, потому что:

    # it will still also match the following Post
    Post(id: 1)
      Tag(post_id: 1, title: 'tag1')
      Tag(post_id: 1, title: 'tag1')
    
    # but that you only want instead those like the following:
    Post(id: 2)
      Tag(post_id: 2, title: 'tag1')
      Tag(post_id: 2, title: 'tag2')
    
0 голосов
/ 26 июня 2018

поиск по двум тегам

Post.includes(:tags).where("tags.title IN (?)",["tagName1", "tagName"]).references(:tag)

Это вернет все сообщения, имеющие tag.title либо «tagName1», либо «tagName»

...