在创建时将项添加到has_many关系

时间:2014-07-14 15:42:02

标签: ruby-on-rails-4

我试图让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中的一个问题。要看......

1 个答案:

答案 0 :(得分:0)

Transaction类不在模块Comptes下。因此,当您在其中has_many :categorizationshas_many :categories时,相应的模型会被推断为CategorizationCategory ,而不是 Comptes::CategorizationComptes::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