3

我有 3 个模型:Category、Account 和 SubAccount
关系是:
Accounts has_many :sub_accounts
Categories has_many :sub_accounts

我想获取给定帐户未使用的所有类别的列表。我在 Category 模型中的方法目前看起来像:

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 更干净的选择?

注意。我目前正在使用 Rails 3(beta)

4

3 回答 3

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
于 2010-04-11T21:57:23.013 回答
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
于 2010-04-12T08:14:07.263 回答
0

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

在更改合并(很快!)之前,您需要安装我的 Arel 分支,但安装它后,您可以执行以下操作:

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

于 2010-05-15T03:00:27.883 回答