0

내 문제를 알려주는 샘플 응용 프로그램을 만들었습니다.has_many : 역변환을 통한 두 번 덧셈을 통해

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 

스키마 :

새로운 바나나가 ActiveAdmin을을 사용하여 만들어집니다
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) 

, 그것을 사용하는 코드 상당의

기본적으로, 나는 STI 클래스와 many-to-many 연관을 갖는다 to :

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

에 호출 후 충전 협회의 사전을해야합니다

답변

2

바구니를 두 번 할당하는 이유는 무엇입니까?

Basket.first.bananas.build(basket_ids: [Basket.first.id]) 

나는이 같은이 작성합니다

Basket.first.bananas.build 
+0

검증이 일에서 저를 방지 할 수 있습니다. – ybart