我正在使用 Ruby on Rails 3.2.13,考虑到在我之前的问题 "How should I use the alias_method_chain for the build method?" 中似乎没有找到任何解决方案,因此我考虑覆盖我的模型类中的 build
方法以获得所需的行为。
我应该如何覆盖我的模型的 build
方法(即使 build
方法在像 @article.comments.build(...)
这样的 ActiveRecord 关联上运行)?
我正在使用 Ruby on Rails 3.2.13,考虑到在我之前的问题 "How should I use the alias_method_chain for the build method?" 中似乎没有找到任何解决方案,因此我考虑覆盖我的模型类中的 build
方法以获得所需的行为。
我应该如何覆盖我的模型的 build
方法(即使 build
方法在像 @article.comments.build(...)
这样的 ActiveRecord 关联上运行)?
有一种方法可以自定义构建方法,在模型关系中定义你的build
:
class Article
has_many :comments do
def build(*args, &block)
#TODO your code
super(*args, &block)
end
end
end
build
是ActiveRecord::Relation
类中new
的别名。在源代码中有这样一行代码来创建这个别名:
alias build new
build
方法的代码:# config/initializers/monkey_patch.rb
class ActiveRecord::Relation
def build
"HHHHHIIIII"
end
end
ActiveRecord::Relation
对象上调用build
方法,则会返回字符串"HHHHHIIIII"。例如,如果一个课程has_many
学生,那么这行代码将在rails console
中返回"HHHHHIIIII":Course.first.students.scoped.build
# config/initializers/monkey_patch.rb
class ActiveRecord::Relation
def my_model_build
"Happy happy, joy joy"
end
end
ActiveRecord::Relation#build
功能,但又想为模型添加自定义的 build,只需将自定义方法添加到 ActiveRecord::Relation
类即可。我更新了我的答案,以展示如何向此类添加方法。我认为您无法在某些地方覆盖 ActiveRecord::Relation#build
方法而在其他地方不覆盖。 - Powers