Ruby on rails 压倒一切;查找“;以干燥的方式记录
我有一些模型需要在其上放置自定义查找条件。例如,如果我有一个联系人模型,每次调用Contact.find时,我都希望限制返回的联系人只属于正在使用的帐户 我通过谷歌(我已经定制了一点)找到了这个: 这非常有效,除了少数情况下帐户id不明确,因此我将其改为:Ruby on rails 压倒一切;查找“;以干燥的方式记录,ruby-on-rails,ruby,activerecord,metaprogramming,overriding,Ruby On Rails,Ruby,Activerecord,Metaprogramming,Overriding,我有一些模型需要在其上放置自定义查找条件。例如,如果我有一个联系人模型,每次调用Contact.find时,我都希望限制返回的联系人只属于正在使用的帐户 我通过谷歌(我已经定制了一点)找到了这个: 这非常有效,除了少数情况下帐户id不明确,因此我将其改为: def self.find(*args) with_scope(:find => { :conditions => "#{self.to_s.downcase.pluralize}.account_id = #{$accou
def self.find(*args)
with_scope(:find => { :conditions => "#{self.to_s.downcase.pluralize}.account_id = #{$account.id}" }) do
super(*args)
end
end
这也很有效,但是,我希望它是干燥的。现在,我有一些不同的模型,我希望使用这种函数。最好的方法是什么
当您回答时,请包含帮助我们理解元编程的代码
(我使用的是Rails v2.1)您没有告诉我们您使用的是哪一个版本的Rails[编辑-它在Rails 2.1上,因此以下建议是完全可操作的],但我建议您使用以下表单,而不是重载查找您自己:
account.contacts.find(...)
这将自动在包含user子句的范围内包装查找(因为您有帐户id,我假设您的帐户在附近的某个地方)
我建议您检查有关作用域的以下资源
- (这不再是边缘:))
class Contact
include NarrowFind
...
end
注意帐户id的sql转义,您可能应该使用
:conditions=>[“…=?”,$account\u id]
语法。Jean的建议是正确的。假设您的模型如下所示:
class Contact < ActiveRecord::Base
belongs_to :account
end
class Account < ActiveRecord::Base
has_many :contacts
end
@account.contacts.activated
如果要向联系人查询添加更多条件,可以使用“查找”:
@account.contacts.find(:conditions => { :activated => true })
如果您发现自己一直在查询激活的用户,您可以将其重构为命名范围:
class Contact < ActiveRecord::Base
belongs_to :account
named_scope :activated, :conditions => { :activated => true }
end
谢谢你,简,这将是一种享受,而且可能是正确的方式。帐户的引入是对现有代码的新添加,所以我想我从这个角度来看太复杂了。我只需浏览并修改现有代码,以确定帐户的范围。完全覆盖模型的基本查找器很可能是一个坏主意,因为它会打破团队以外任何人的期望,包括插件作者(想想搜索插件),更不用说破坏rails本身的风险(不太可能,但并非不可能)
class Contact < ActiveRecord::Base
belongs_to :account
named_scope :activated, :conditions => { :activated => true }
end
@account.contacts.activated