Есть ли ActiveRecord, эквивалентный использованию вложенного подзапроса, т. Е. Где NOT IN (выбрать ...)? - PullRequest
3 голосов
/ 11 апреля 2010

У меня есть 3 модели: категория, аккаунт и субаккаунт
Отношения:
Аккаунты has_many: sub_accounts
Категории has_many: sub_accounts

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

class Category < ActiveRecord::Base  
  def self.not_used_by(account)
      Category.find_by_sql("select * from categories where id not in(select category_id from sub_accounts where account_id = #{account.id})")
  end
end

Мой вопрос: есть ли более чистая альтернатива, чем использование SQL?

NB. Я в настоящее время использую Rails 3 (бета)

Ответы [ 3 ]

3 голосов
/ 12 апреля 2010

Вы можете переместить метод в модель учетной записи и использовать больше ActiveRecord, выполнив что-то вроде:

class Account < ActiveRecord::Base  
  def unused_categories
    Category.where("id NOT IN (?)", sub_accounts.map(&:category_id))
  end
end

Тогда вы можете сделать что-то вроде:

Account.first.unused_categories
0 голосов
/ 15 мая 2010

Попробуйте MetaWhere. http://metautonomo.us/projects/metawhere

Вам потребуется мой форк Arel, пока изменения не будут объединены (скоро!), Но с его установкой вы можете сделать что-то вроде:

Category.where (: id.not_in => sub_accounts.map (&: category_id))

0 голосов
/ 12 апреля 2010

AR не делает этого из коробки. Вы также можете проверить превосходный SearchLogic гем для программного подхода.

search = Category.search
search.id_not_in sub_accounts.map(&:category_id)
search.name_equals "auto"
search. ..# other conditions
search.all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...