模型上的多个 belongs_to 导致父级上的 accepts_nested_attributes_for 出错

multiple belongs_to on model causing errors with accepts_nested_attributes_for on parent

我有一个子模型,其中 belongs_to 两个潜在的父模型。其中之一我正在尝试将 accepts_nested_attributes_forsimple_form 一起使用。这样做会给我这个错误: You tried to define an association named transaction on the model Exchange, but this will conflict with a method transaction already defined by Active Record. Please choose a different association name.

这是我的代码:

交换模型

class Exchange < ActiveRecord::Base
  has_one :transaction
  accepts_nested_attributes_for :transaction
end

类别模型

class Category < ActiveRecord::Base
  has_many :transactions
  monetize :budgeted_cents
end

交易模型

class Transaction < ActiveRecord::Base
  belongs_to :category, :class_name => 'Category', :primary_key => 'category_id'
  belongs_to :exchange, :class_name => 'Exchange', :primary_key => 'exchange_id'
  validates :note, presence: true
  monetize :amount_cents, with_model_currency: :in_cents_currency

  def self.all_currencies(hash)
    hash.keys
  end
end

我是不是做错了什么,还是我从错误的角度处理问题?

谢谢

正如@vee 指出的那样,'transaction' 是一个保留字,尽管直到 Rails 4.1.x 版本才强制执行。

在整个应用程序范围内更改术语 'transaction' 需要在客户的预算之外开展工作。所以我使用的解决方案是用这里的副本替换模块 "ActiveRecord::Associations::Builder"(针对你的 Rails 版本进行调整):

https://github.com/rails/rails/blob/4-1-stable/activerecord/lib/active_record/associations/builder/association.rb

我将该 association.rb 代码的副本放置在我的应用程序 (lib/active_record/associations/builder) 中层次结构中的相同位置,但注释掉了以下行:

# if model.dangerous_attribute_method?(name)
# raise ArgumentError, "You tried to define an association named #{name} on the model #{model.name}, but " \
# "this will conflict with a method #{name} already defined by Active Record. " \
# "Please choose a different association name."
# end

只有当 'name' 与冲突的术语 'transaction' 匹配时,您才可以尝试跳过它(修改 'if')。 对于其他被卡住的人,这条路线避免了必须停留在 Rails 版本 4.0.x 或早期的 4.1 beta.