0

スコープを持つ次の User オブジェクトがあります。

Class User < ActiveRecord::Base
  ...
  scope :vendors,   lambda { where(:user_type => 'v') }
  scope :customers, lambda { where(:user_type => 'c') }
  ...

inactiveベンダーと顧客で異なる動作をする新しいスコープを作成したい(例: 疑似コード)

  scope :inactive, lambda {
    if (:user_type => 'v')
      where(some_condition_only_for_vendors)

    elsif (:user_type => 'c')
      where(different_condition_only_for_customers)

    else
      where(another_condition)

    end
  }

このようにして、users.vendors.inactiveある一連の条件に基づいてすべての非アクティブなベンダーをusers.customers.inactive取得し、別のセットに基づいてすべての非アクティブな顧客を取得するようなことができます。

これは可能ですか、それとももっと良い方法がありますか? ここには多くのレガシー コードがあるため、継承の実装は実行できない可能性があることに注意してください。

ありがとう!

4

1 に答える 1

0

すぐにわかる問題は、クラスからスコープを呼び出し、user_type を取得するためのレコード インスタンスがないことです。

User.inactive

したがって、次のようなものがあるかもしれません:

class User < ActiveRecord::Base
  scope :inactive, lambda { |user_type|
    case user_type
    when 'v'
      where(some_condition_only_for_vendors)
    when 'c'
      where(different_condition_only_for_customers)
    else
      where(another_condition)
    end
  }

  def related_users
    User.inactive(user_type).all
  end
end
于 2012-09-26T19:46:08.047 に答える