2015-08-27 8 views
0

У меня есть отношения «многие-ко-многим» с User, Attachment и Form model.Rails has_many через запрос

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

Attachment.includes(:forms,:users).where.not('forms.user_id = ?', @user.id).references(:forms,:users) 

Я пробовал больше, но не нашел правильный.

user.rb

has_many :forms 
    has_many :attachments, through: :forms 

attachment.rb

has_many :forms 
    has_many :users, through: :forms 

forms.rb

belongs_to :user 
    belongs_to :attachment 

Update:

я м до сих пор найти ответ

Attachment.includes(:forms).where(forms: {user_id: user.id}).references(:forms) 

работает, но where.not возвращает пустые

Я думаю where.not выглядит только вложения, связанные для составления не всех из них

+0

Можете ли вы показать фактические ассоциации ваших моделей? – IngoAlbers

+0

Я отредактировал вопрос –

ответ

1

It «S на самом деле довольно просто:

Первый (суб) запрос вам потребуется, чтобы получить все вложения пользователя делает есть:

subquery = @user.attachments.select(:id) 

Тогда вы можете легко получить все вложения, которые дона 't имеют идентификаторы из подзапроса.

Attachment.where.not(subquery) 
# same as 
Attachment.where.not(@user.attachments.select(:id)) 

ведущий к запросу:

SELECT "attachments".* 
    FROM "attachments" 
    WHERE ("attachments"."id" NOT IN (
    SELECT "attachments"."id" 
    FROM "attachments" 
    INNER JOIN "forms" 
    ON "attachments"."id" = "forms"."attachment_id" 
    WHERE "forms"."user_id" = $1 
)) 
+0

Удалось ли вам найти ошибку? Кроме того, я удалю свои комментарии, они беспорядок и не будут служить будущим читателям - вы тоже должны –

+0

Я все еще жду, я узнаю больше о запросах, надеюсь, –

Смежные вопросы