以下是父级和子级之间的类定义:-
class System
has_many :members, :dependent => :destroy
accepts_nested_attributes_for :members
attr_accessible :name, :members_attributes
validates_presence_of :name , :members
class Member
belongs_to :system
attr_accessible :name
validates_presence_of :name
before_create :create_physical_schema_for_user
在控制器中,我一口气创建了整个关系:-
@system = System.new(params[:system])
...
@system.save
事情一直很好,直到孩子中的一个 before_create 回调因 OCIError(由 ruby-oci8 gem 引发)导致 ActiveRecord::StatementInvalid 异常而失败。在这个阶段,即使其中一个子关联没有被保存,父也会被保存。我不确定,如果这是 rails 或 oracle 适配器的问题。
另外仅供参考,create_physical_schema_for_user 方法以下列方式运行一组 DDL:-
def self.create_physical_schema_for_user(name)
ddl_stmt = ['...',name]
self.connection.execute(sanitize_sql(ddl_stmt))
end
我发现这些链接正在讨论相同的问题(只是回调不同)
https://rails.lighthouseapp.com/projects/8994/tickets/3391-nested-attributes-vs-before_save
其中一个说这已经合并到 Rails 2 中,我仍然在 rails 3.2.5 中遇到了这个问题,但是使用了 Oracle 适配器
我想知道在单个事务中固有地保存父级及其所有关联的最佳方法是什么,这样即使一个子级创建失败,我们也会回滚整个父级事务。
环境:Rails 3.2.5,Ruby 1.9.2
数据库:Oracle 11g XE 通过 ruby-oci8 (2.1.2) & activerecord-oracle_enhanced-adapter (1.4.1) gem