ruby-on-rails - 如何将现有记录添加到 has_many 而不立即保存到数据库?

标签 ruby-on-rails ruby-on-rails-3

假设我有这个:

class Pirate < ActiveRecord::Base
  has_many :parrots
  validates_presence_of :name
end

class Parrot < ActiveRecord::Base
  belongs_to :pirate
end

我已经有 ids 1 到 10 的现有 Pirates 和 Parrots。现在我想这样做:
p = Pirate.first
p.name = nil
p.parrot_ids = [1,2,3]
p.save if p.valid?

因为盗版对象无效(缺少名称),所以我不想保存它。但是,鹦鹉现在与海盗相关联,并且已在数据库中提交。

如何分配鹦鹉,但只有在 p.save 成功时才将鹦鹉的链接保存到数据库中?即,如何在一笔交易中保存海盗和鹦鹉的链接?

最佳答案

您可能应该看看 Active Record 事务。
您可以将代码包装在事务块中。事务是保护块,其中 SQL 语句只有在它们都可以作为一个原子操作成功时才​​是永久的

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

关于ruby-on-rails - 如何将现有记录添加到 has_many 而不立即保存到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291115/

相关文章:

ruby-on-rails - Rails 列出所有有效的内容类型

ruby-on-rails - rake 请求 :workers command forks infinite processes

ruby-on-rails-3 - 样式占位符与 best_in_place 的值不同

ruby-on-rails - 如何在 Rails 中调试静默数据库错误(例如 "save")?

ruby-on-rails - url 中的语言环境前缀

ruby-on-rails - Mac OSX 10.5.8 上的 Ruby on Rails 3.1.1

ruby-on-rails - 没有 Rails、Rspec 或 Cucumber 的 Capybara 的 NoMethod 错误

ruby-on-rails - Ruby on Rails : Creating an email for an event using iCalendar. Google 无法识别

ruby-on-rails - 如何设置 Rails 中路由的默认格式?

ruby - Rails Fixtures 中的引用用户