3

我在两个模型之间有一个简单的 has_one/belongs_to 关系。

这是我的应用程序中的一个新关联,因此有许多记录尚未创建关联记录。

在我的整个应用程序中,我假设模型具有关联并且我正在访问它的属性和方法。但是,由于该关联不存在,我遇到了很多错误。

我想做的是在第一次通过它的任何方法和属性访问时,不显眼地动态构建关联的记录。记录中有数据并不重要,我只需要它存在,这样我调用的那些方法就可以构建数据。

编辑:我不想在我试图访问关系的所有实例上检查并创建记录,所以理想情况下,这需要在模型本身上完成,而不是在我的任何地方的控制器中完成。

有什么想法吗?

谢谢!

4

4 回答 4

1

这就是我们最终得到的结果。它不是我写的(一位同事写的),但它通过了我为这个案例编写的先前失败的测试。

def stats_with_create
  stats_without_create || create_stats
end
alias_method_chain :stats, :create
于 2009-05-20T20:17:30.500 回答
0

在控制器中,您可以在show方法中添加这样的内容(未经测试,但它应该给您一个想法:

@thing = Thing.find params[:id]
if @thing.other_thing.nil?
  @thing.other_thing = OtherThing.new.save!
  @thing.save!
end

这并不理想,您可以通过在 Thing 模型中放置一个方法来检查并创建相关模型而不是将其放入控制器中来清理它。

另一种选择是创建一个用于访问 的新访问器other_thing,并根据需要创建它。

但是,正确的做法可能是在迁移中或直接修复您的数据,正确创建相关模型。

于 2009-05-20T18:35:50.363 回答
0

直接的答案是覆盖关系的方法。调用时它将检查记录是否存在,如果不存在则创建它。

但是,我建议您使用迁移来预先创建所有记录。

于 2009-05-20T19:05:36.963 回答
0

我以前做过这种事情,但不是在模型层面上。我已经在控制器级别使用 before_filter 完成了它,该过滤器在所有需要访问已经存在或不存在的模型关联的方法之前运行。

我刚刚意识到你可以在模型中使用 after_find 和 after_initialize 回调。

你可以坚持:

def after_initialize
   association.build if association.nil?
end

在您的模型中,它应该可以解决您的问题..(免责声明:未经我测试):)

于 2009-05-20T19:12:45.780 回答