3

カテゴリ、アカウント、およびサブアカウントの 3 つのモデルがあります
。関係は次のとおりです。
アカウント has_many :sub_accounts
カテゴリ 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(ベータ)を使用しています

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

MetaWhere を試してみてください。http://metautonomo.us/projects/metawhere

変更がマージされるまで (すぐに!)、Arel のフォークをインストールする必要がありますが、インストールすると、次のようなことができます。

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

于 2010-05-15T03:00:27.883 に答える
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 に答える