Rails:具有条件的依赖范围

时间:2012-09-26 19:35:09

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

我有以下带有范围的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根据另一组条件获取所有非活动客户。

这可能或有更好的方法吗?请注意,这里有很多遗留代码,因此实现继承可能不可行。

谢谢!

1 个答案:

答案 0 :(得分: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