В Rails 3, как я могу выбрать элементы, где items.join_model.id! = X? - PullRequest
1 голос
/ 21 июля 2011

В моих моделях Rails у меня есть:

class Song < ActiveRecord::Base
  has_many :flags
  has_many :accounts, :through => :flags
end

class Account < ActiveRecord::Base
  has_many :flags
  has_many :songs, :through => :flags
end

class Flag < ActiveRecord::Base
  belongs_to :song
  belongs_to :account
end

Я ищу способ создания области действия в модели Song, которая выбирает песни, НЕ связанные с данной учетной записью.

Я пробовал:

Song.joins(:accounts).where('account_id != ?', @an_account)

, но он возвращает пустой набор.Это может быть потому, что есть песни, к которым не привязаны аккаунты?Я не уверен, но действительно борюсь с этим.

Обновление

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

Спасибо за внимание.

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Правильно ли я понимаю ваш вопрос - вы хотите, чтобы песни, не связанные с определенной учетной записью?

Попробуйте:

Song.joins(:accounts).where(Account.arel_table[:id].not_eq(@an_account.id))

Ответ исправлен: (вответ на уточнение в комментариях)

Вы, вероятно, хотите условия SQL, подобные этому:

Song.all(:conditions =>
  ["songs.id NOT IN (SELECT f.song_id FROM flags f WHERE f.account_id = ?)", @an_account.id]
)

Или в ARel, вы можете получить тот же SQL, сгенерированный следующим образом:

Я обычно предпочитаю ARel, и я предпочитаю его и в этом случае.

0 голосов
/ 21 июля 2011

Если ваше предложение where не является опечаткой, оно неверно.Код часто использует == для равенства, но sql нет, используйте один знак равенства, например:

Song.joins(:accounts).where('account_id = ?', @an_account.id)

Редактировать:

На самом деле есть способиспользовать activerecord, чтобы сделать это для вас, вместо того, чтобы писать свои собственные связанные фрагменты sql:

Song.joins(:accounts).where(:accounts => {:id => @an_account.id})
...