使用Rails ActiveRecord进行智能过滤

时间:2011-02-21 00:09:29

标签: ruby-on-rails activerecord single-table-inheritance

让我们假设我有一个AR模型Foo

Foo.find 方法将根据条件返回foo表中的所有条目。我需要的是拥有某种默认条件,例如country column,这样如果我以某种方式定义AR,我的所有 Foo.find 方法都只会返回该国家/地区的参赛作品...

如何告诉AR使用此类默认行为或动态设置?

1 个答案:

答案 0 :(得分:1)

好吧,我认为你正在谈论覆盖查找功能,这可能不是那么安全,但可行。您也会遇到支持不同查找格式的问题。例如,你将如何处理Foo.find(1)和Foo.find([1,2,3])?要以安全的方式执行此操作,您应该使用范围。例如,在Rails 3中,您将执行以下操作:

class Foo
  scope :country, lambda{ |country| where(country: country) }
end

然后,您可以在调用查询Foo时随时使用此范围。例如:

Foo.country('United States').where(...).all

如果你想进一步简化这段代码,因为你经常使用它,你可以在Foo上创建一个函数来处理这个:

class Foo
  def self.with_country
    country(current_selected_country)
  end
end

这样你就可以进行这样的查找:

Food.with_country.all

通过使用此方法,您可以避免必须覆盖默认的ActiveRecord功能,因此您的代码更易于其他开发人员理解,您不必担心支持一堆不同的方法格式和调用。

如果您确实希望这是您的默认行为,您可以像这样使用ActiveRecord default_scope:

class Foo
  default_scope where(country: 'United States')
end

这将在创建记录时应用,但在更新记录时不适用。