ActiveRecord: поиск без ассоциаций - PullRequest
0 голосов
/ 09 июля 2009

У меня есть many_to_many отношение между ImageShells и пользователями. Мне нужно найти все ImageShells, которые не имеют пользователей.

У меня есть запрос, который находит их, но как мне поместить это в named_scope?

SELECT * FROM image_shells INNER JOIN image_shells_users ON (image_shells_users.image_shell_id!=image_shells.id)


class ImageShell < ActiveRecord::Base
   has_and_belongs_to_many :riders, :class_name => "User"
end

class User < ActiveRecord::Base  
  has_and_belongs_to_many :image_shells
end

Я могу использовать поиск по sql, но это грязно.

img_shells_with_out_users = ImageShell.find_by_sql 'SELECT * FROM image_shells INNER JOIN image_shells_users ON (image_shells_users.image_shell_id!=image_shells.id)'

Ответы [ 3 ]

8 голосов
/ 10 июля 2009

Должен сделать трюк

named_scope :without_users, { :include => :users, 
   :conditions => 'image_shell_users.user_id IS NULL' } 

ActiveRecord позаботится о создании всех правильных соединений для вас при использовании опции включения. Чтобы включить пользователей, необходимо пройти через таблицу соединений, чтобы вы могли использовать ее в своих условиях.

1 голос
/ 09 июля 2009

Супер просто

  named_scope :with_out_users, {
:select => "image_shells.*",
:joins => "INNER JOIN image_shells_users ON (image_shells_users.image_shell_id!=image_shells.id)" 
  }
0 голосов
/ 09 июля 2009
named_scope :without_users, 
  :conditions => "not exists (select * from image_shells_users where
                  image_shell_users.image_shell_id = image_shells.id)"

SQL, который вы указали в вопросе, на самом деле не находит оболочки изображений без пользователей, он фактически присоединяет оболочку изображения к каждому пользователю в базе данных, имеющей оболочку изображения, кроме оболочки изображения, к которой вы обращаетесь. ,

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