ArgumentError는 Active Record 메서드가 원인일 때가 있어 【class_name 옵션】

4290 단어 초보자RailsRails5

어느 날 이런 오류가 발생했습니다.




? ? ?

직역・・・



'You tried to define an association named transaction on the model Product, but this will conflict with a method transaction already defined by Active Record. Please choose a different association name.'

: 모델 Product에 transaction이라는 연관을 정의하려고 시도했지만 Active Record에서 이미 정의한 메소드 트랜잭션과 충돌합니다. 다른 연결 이름을 선택합니다. 』

하테?
어디서 메소드 이름이 쓰여졌는지 하룻밤 생각했습니다・・・

원인



여기 의 Rails 문서를 보고 놀랐습니다.

원래 정의되어 있는 Active Record의 메소드에 「transaction」이 있군요.



수정



수정 방법으로는 두 가지가있었습니다.
  • 테이블 이름 바꾸기
  • class_name 옵션을 사용해 메소드명을 바꾼다

  • 이번에는 이미 상당히 구현을 진행하고 있었으므로 class_name 옵션을 사용하기로 결정했습니다.

    class_name 옵션은 보통은 같은 모델을 참조하는 외래 키를 2개 이상 갖게 하고 싶을 때에 사용한다고 합니다.

    (사용 예)
        belongs_to :buyer, class_name: 'User', foreign_key: 'buyer_id'
        belongs_to :seller, class_name: 'User', foreign_key: 'seller_id'
    

    이번은 메소드명을 「트랜잭션」을 「트레이드」에.

    product.rb
    class Product < ApplicationRecord
      belongs_to :user
      has_one :trade, class_name:"Transaction", dependent: :destroy
    end
    

    transaction.rb
    class Transaction < ApplicationRecord
      belongs_to :user, optional: true
      belongs_to :product, optional: true
    end
    

    user.rb
    class User < ApplicationRecord
      devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable
      has_many :products
      has_many :trade, class_name:"Transaction", foreign_key: "transaction_id"
    end
    

    무사히 해결~!



    다음 번부터 간에 명령합니다 ...

    참고



    Rails 가이드
    rails 연관 옵션 노트
    Rails 문서

    좋은 웹페이지 즐겨찾기