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
검증이 일에서 저를 방지 할 수 있습니다. – ybart