ruby-on-rails - 如何使用 STI 建立 ActiveRecord 关联

标签 ruby-on-rails associations sti

我在尝试建立从其他人那里继承的模型关联时遇到了 AR 问题。问题是在调用执行 save 方法之前将关联的模型保存到数据库中。

我在这个页面找到了更多信息 http://techspry.com/ruby_and_rails/active-records-or-push-or-concat-method/

这真的很奇怪,为什么 AR 会自动保存附加到关联的模型(使用 << 方法)?显然,即使父级已经存在,也必须调用 save 方法。我们可以阻止这个调用

@user.reviews.build(good_params)

但这在关联具有层次结构的上下文中会出现问题,例如:如果 Hunter has_many :animals,而 Dog 和 Cat 继承自 Animal,我们就不能这样做
@hunter.dogs.build
@hunter.cats.build 

相反,我们被困在
@hunter.animals << Cat.new
@hunter.animals << Dog.new 

如果 Cat/Dog 类没有验证,该对象将自动保存到数据库中。我怎样才能防止这种行为?

最佳答案

我发现 Rails 3 不完全支持与 STI 的关联,通常需要 hacks。阅读这篇文章的更多内容 http://simple10.com/rails-3-sti/ 。正如其中一条评论中提到的,这个问题在 rails 4 https://github.com/rails/rails/commit/89b5b31cc4f8407f648a2447665ef23f9024e8a5 中提到
Rails sux 处理继承如此糟糕 = (( 希望 Rails 4 解决了这个问题。

同时我正在使用这个丑陋的解决方法:

animal = @hunter.animals.build type: 'Dog' 

然后替换构建的对象,这一步可能是反射锻炼所必需的(检查露西的回答和评论)
hunter.animals[@hunter.animals.index(animal)] = animal.becomes(Dog)

这将在这种情况下正确运行,因为
hunter.animals[@hunter.animals.index(animal)].is_a? Dog

将返回 true 并且不会对分配进行任何数据库调用

关于ruby-on-rails - 如何使用 STI 建立 ActiveRecord 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15264680/

相关文章:

ruby - 使用数据映射器指定结果的顺序

ruby-on-rails - 一个 fields_for 中的多个文本字段

ruby-on-rails - Rails Sti : single path, 不同的 Controller

ruby-on-rails - 使用 Carrierwave 和 MiniMagick 将 SVG 转换为透明 PNG

ruby-on-rails - 重构以下代码行

ruby-on-rails - 在同一个 Controller 中使用两个不同的布局模板?

mysql - Searchkick 使用 DateTime 查询的语法是什么

rspec - Rspec模型关联

ruby-on-rails - 声明 Rails 模型子类的静态属性

ruby-on-rails - 这是对 Rails 单表继承的合法使用吗?