我该如何/应该如何重写我的模型的`build`方法?(涉及IT技术)

3

我正在使用 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 关联上运行)?


看起来是时候打开Rails源代码了! - Alex D
2个回答

8

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

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

            super(*args, &block)
        end
    end
end

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

1

buildActiveRecord::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

以下是如何向ActiveRecord :: Relation类添加方法的方法:
# config/initializers/monkey_patch.rb
class ActiveRecord::Relation
  def my_model_build
    "Happy happy, joy joy"
  end
end

我需要仅更改一个模型的行为,而不是应用程序中的所有模型。 - Backo
@Backo - 如果您想保留 ActiveRecord::Relation#build 功能,但又想为模型添加自定义的 build,只需将自定义方法添加到 ActiveRecord::Relation 类即可。我更新了我的答案,以展示如何向此类添加方法。我认为您无法在某些地方覆盖 ActiveRecord::Relation#build 方法而在其他地方不覆盖。 - Powers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接