我正在使用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(...)
)?
答案 0 :(得分:7)
有一种方法可以自定义构建方法,在模型关系中定义build
:
class Article
has_many :comments do
def build(*args, &block)
#TODO your code
super(*args, &block)
end
end
end
如果您不需要构建方法的默认参数,那么您可以使用自己的。
答案 1 :(得分:1)
build
是ActiveRecord::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