我试图让has_many关系适用于要创建的对象。
这是一个简单的案例,尽管通过网络进行了许多努力和研究,但我找不到为什么我的代码无效。
我有以下类(注意:一些变量使用法语名称):
class Comptes::Category < ActiveRecord::Base
has_many :categorizations, dependent: :destroy
accepts_nested_attributes_for :categorizations
has_many :transactions, through: :categorizations
validates :nom, presence: true, uniqueness: true
end
class Comptes::Transaction < ActiveRecord::Base
has_many :categorizations, dependent: :destroy
accepts_nested_attributes_for :categorizations
has_many :categories, through: :categorizations
... # some validations
end
class Comptes::Categorization < ActiveRecord::Base
belongs_to :transaction
belongs_to :category
validates :transaction, presence: true
validates :category, presence: true
end
类别和交易是基本模型,分类专用于关联(这是一个基本账户 - 交易系统)。
我能做什么是创建一个交易和一个类别然后用类别填充transaction.categories(事务因此具有一个id)。
我不能做的是:
transaction = Comptes::Transaction.new ...
category = Comptes::Category.first
transaction.categories << category
# OR
transaction.categorizations.build category: category
# OR
# use categorizations_attributes in and accepts_nested_attributes_for.
非常感谢您的帮助
编辑:这是在rails 4.0.0中完成的 我发现问题来自于Comptes :: Categorization中的验证。 如果事务或类别尚不存在,这将阻止创建新的分类。
更新(2014年8月18日):问题来自分类中的验证,这会阻止在没有现有事务和类别的情况下创建关联。这可能是rails 4.0.0中的一个问题。要看......
答案 0 :(得分:0)
Transaction
类不在模块Comptes
下。因此,当您在其中has_many :categorizations
或has_many :categories
时,相应的模型会被推断为Categorization
和Category
,而不是 Comptes::Categorization
和Comptes::Category
。
要解决此问题,您需要指定关联的 class_name选项,因为无法从关联名称推断出模型的名称。
更新课程Transaction
,如下所示:
class Transaction < ActiveRecord::Base
has_many :categorizations, class_name: "Comptes::Categorization" , dependent: :destroy
accepts_nested_attributes_for :categorizations
has_many :categories, through: :categorizations, class_name: "Comptes::Category"
end