Как написать область для модели, которая принадлежит_ двум другим моделям и исключает все записи с соответствующими внешними ключами - PullRequest
0 голосов
/ 26 июня 2018

Я хочу написать область действия для модели, которая принадлежит_ двум другим моделям. Эта область должна выбирать все записи, где значение одной модели не равно значению ее родителя. То, что у меня ниже, похоже, должно работать:

Class Blob
 belongs_to :user
 belongs_to :item

 scope: :not_owned_by_item_owner, ->  { where.not(user_id: item.owner.id) }
end

Но затем вызов blob.not_owned_by_item_owner в любом месте контроллера приводит к ошибке undefined local variable or method для item. Почему item не распознается?

1 Ответ

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

Раствор 1

scope :not_owned_by_item_owner, -> {
  joins(:item).where.not(
    Blob.arel_table[:user_id].eq(Item.arel_table[:owner_id])
  )
}
# SELECT  "blobs".* FROM "blobs" INNER JOIN "items" ON "items"."id" = "blobs"."item_id" WHERE "blobs"."user_id" != "items"."owner_id"

Раствор 2

или, если вы предпочитаете сырой SQL:

scope :not_owned_by_item_owner, -> {
  joins(:item).where('blobs.user_id != items.owner_id')
}
# SELECT  "blobs".* FROM "blobs" INNER JOIN "items" ON "items"."id" = "blobs"."item_id" WHERE (blobs.user_id != items.owner_id) LIMIT $1

P.S. Я не думаю, что есть ActiveRecord нативное решение для этого, но мне также интересно, если кто-нибудь найдет его. В приведенном выше решении 1 используется Arel напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...