Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 压倒一切;查找“;以干燥的方式记录_Ruby On Rails_Ruby_Activerecord_Metaprogramming_Overriding - Fatal编程技术网

Ruby on rails 压倒一切;查找“;以干燥的方式记录

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

我有一些模型需要在其上放置自定义查找条件。例如,如果我有一个联系人模型,每次调用Contact.find时,我都希望限制返回的联系人只属于正在使用的帐户

我通过谷歌(我已经定制了一点)找到了这个:

这非常有效,除了少数情况下帐户id不明确,因此我将其改为:

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