是否存在等效于使用嵌套子查询的ActiveRecord,即...其中NOT IN(选择...)?

时间:2010-04-11 12:24:19

标签: ruby-on-rails ruby-on-rails-3

我有3个型号:Category,Account和SubAccount
关系是:
帐户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 个答案:

答案 0 :(得分:3)

您可以将方法移动到帐户模型,并通过执行以下操作来使用更多ActiveRecord:

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

然后你可以这样做:

Account.first.unused_categories

答案 1 :(得分:0)

AR不会开箱即用。您可能还想检查优秀SearchLogic gem的程序方法。

search = Category.search
search.id_not_in sub_accounts.map(&:category_id)
search.name_equals "auto"
search. ..# other conditions
search.all

答案 2 :(得分:0)

尝试MetaWhere。 http://metautonomo.us/projects/metawhere

你需要安装我的Arel分支,直到变更合并(很快!)但是安装它后你可以做类似的事情:

Category.where(:id.not_in =&gt; sub_accounts.map(&amp;:category_id))