让我们假设我有一个AR模型Foo
Foo.find 方法将根据条件返回foo表中的所有条目。我需要的是拥有某种默认条件,例如country column,这样如果我以某种方式定义AR,我的所有 Foo.find 方法都只会返回该国家/地区的参赛作品...
如何告诉AR使用此类默认行为或动态设置?
答案 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
这将在创建记录时应用,但在更新记录时不适用。