模型上的多个 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_for
与 simple_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 版本进行调整):
我将该 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.
我有一个子模型,其中 belongs_to
两个潜在的父模型。其中之一我正在尝试将 accepts_nested_attributes_for
与 simple_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 版本进行调整):
我将该 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.