我怎么能/应该覆盖我的模型的`build`方法?

时间:2013-08-11 13:15:06

标签: ruby-on-rails ruby class methods override

我正在使用Ruby on Rails 3.2.13,因为在我之前的问题"How should I use the alias_method_chain for the build method?"中似乎找到了任何解决方案,我正在考虑在我的模型类中覆盖build方法为了得到想要的行为。

我怎样才能/应该覆盖我的模型的build方法(即使build方法运行ActiveRecord关联类似@article.comments.build(...))?

2 个答案:

答案 0 :(得分:7)

有一种方法可以自定义构建方法,在模型关系中定义build

class Article
    has_many :comments do 
        def build(*args, &block)
            #TODO your code

            super(*args, &block)
        end
    end
end

如果您不需要构建方法的默认参数,那么您可以使用自己的。

答案 1 :(得分:1)

buildActiveRecord::Relation类中new的别名。 source code中有一行用于制作别名:

alias build new

以下是如何覆盖build方法:

# config/initializers/monkey_patch.rb
class ActiveRecord::Relation
  def build
    "HHHHHIIIII"
  end
end

如果在build个对象上调用ActiveRecord::Relation方法,则返回字符串“HHHHHIIIII”。例如,如果是课程has_many的学生,此行将在rails console中返回“HHHHHIIIII”:

Course.first.students.scoped.build

以下是如何向ActiveRecord :: Relation类添加方法:

# config/initializers/monkey_patch.rb
class ActiveRecord::Relation
  def my_model_build
    "Happy happy, joy joy"
  end
end