0
我已经创建了一个启发我的问题的示例应用程序。has_many:通过关联反向添加两次
基本上,我有一个STI类许多一对多关联关系:
class Basket < ActiveRecord::Base
has_many :basket_fruits, inverse_of: :basket
has_many :fruits, through: :basket_fruits
has_many :apples, through: :basket_fruits, source: :fruit, class_name: 'Apple'
has_many :oranges, through: :basket_fruits, source: :fruit, class_name: 'Orange'
has_many :bananas, through: :basket_fruits, source: :fruit, class_name: 'Banana'
end
class BasketFruit < ActiveRecord::Base
belongs_to :basket, inverse_of: :basket_fruits
belongs_to :fruit, inverse_of: :basket_fruits
validates :basket, :fruit, presence: true
end
class Fruit < ActiveRecord::Base
has_many :basket_fruits, inverse_of: :fruit
has_many :baskets, through: :basket_fruits
validates :type, presence: true, inclusion: ['Apple', 'Banana', 'Orange']
validates :baskets, presence: true
end
class Apple < Fruit; end
class Banana < Fruit; end
class Orange < Fruit; end
模式:
Basket(id: integer, created_at: datetime, updated_at: date time)
BasketFruit(id: integer, fruit_id: integer, basket_id: integer, created_at: datetime, updated_at: date time)
Fruit(id: integer, type: string, created_at: datetime, updated_at: datetime)
当使用ActiveAdmin创建一个新的香蕉,它使用的代码,这相当于到:
Basket.create
banana = Basket.first.bananas.build(basket_ids: [Basket.first.id])
发生的问题是,此代码创建两个关联,其中ca n即使不保存香蕉也可以观察到:
banana.basket_fruits.size
=> 2
为什么会发生这种情况,以及如何解决它?
更新
刚刚发现这一点。也许这就是为什么AR正试图增加两倍的关系,而不是“压倒一切”,因为我本来期望:
banana = Basket.first.bananas.build
=> #<Banana id: nil, type: "Banana", created_at: nil, updated_at: nil>
banana.baskets
=> #<ActiveRecord::Associations::CollectionProxy []>
在这种情况下,一个需要填补了电话后,联想前到#build
验证阻止我这样做。 – ybart