2014-03-29 5 views
4

의 하위 클래스가 아닙니다 사용자와 트랜잭션 간의 다 대다 관계를 통해 사용자가 작성한 각 구매를 기록하고 조인 테이블 "transactuins_users"를 통해 링크를 연결하려고합니다. 하지만 두 가지 문제가 있습니다. 첫째, 생성물을 제공해야합니다. 메서드를 호출 할 때 id라는 객체를 사용했기 때문에 Rails가 연관성을 고려하여이 값을 알아 내야한다고 생각했습니다. 내가 구입 메소드를 호출 할 때마다 또한유효하지 않은 단일 테이블 상속 유형

, 나는 오류가 발생 :

class User < ActiveRecord::Base 

    # Associations 
    has_and_belongs_to_many :transactions 

    def purchase(package) 
    return false unless funds_available?(package) and !owns?(package) 
     package.with_lock do 

     # Makes transaction 
     package.user_id = id 
     package.save! 
     withdraw(package.cost) 

     # Records transaction 
     values = {user_id: id, type: "buy", cost: package.cost} 
     transactions.create values 
    end 
    end 


class Transaction < ActiveRecord::Base 

    # Associations 
    has_and_belongs_to_many :transactions 

    # Validations 
    validates :user_id, :cost, presence: true 

답변

13

액티브 레코드 "잘못된 단일 테이블 상속 형 구매 거래의 서브 클래스가 아닌"입니다 schema conventions 어떤 다른에 사용이 행동. 이러한 규칙 중 하나는 모델에서 단일 테이블 상속을 사용하려는 경우 열 이름 "type"을 사용하는 것입니다. STI를 사용하려고 한 것처럼 보이지 않으므로 열의 이름을 "종류"또는 "카테고리"와 같은 다른 이름으로 변경하는 것이 좋습니다.

다양한 유형의 트랜잭션에 대해 다른 동작을 계획하고 있다면 단일 테이블 상속을 사용하는 것이 좋습니다.

+0

멋지다, 작동시키지 만, 왜 수동으로 user_id 속성을 전달해야하는지 이해할 수 없습니까? – manis

+0

거래 모델에'belongs_to : user'가 없습니다. –

9

모델에 self.inheritance_column = nil을 추가하십시오. 유형이 예약되어 있습니다. 이렇게하면 사용할 수 있습니다.

4

동일한 오류가 발생했습니다. 당신은 지금까지 이미 그것을 풀었 음에 틀림 없지만 다른 누군가가 그것을 찾고 있다면, 나는 질문과 마찬가지로 type이라는 이름의 필드를 가지고 있습니다.

type은 예약어로 상속에 사용됩니다. 따라서 type: "buy"을 사용하면 buy 모델을 찾으려고 시도하고 buy 모델이 User로부터 상속 될 것으로 예상합니다.

는 더 나은 이해를 위해 내 로그를 공유 할 수 있습니다 :

Parameters: {"step"=>{"type"=>"Email Template", "step_name"=>"Step name", "no_of_days"=>20, "cadence_id"=>nil, "email_template_id"=>nil}} 

Completed 500 Internal Server Error in 238ms 

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: Email Template is not a subclass of Step): 
    app/controllers/steps_controller.rb:15:in `create' 

여전히 type로 필드 이름을 유지해야하는 경우, 내가 도울 수있는 user 모델에 self.inheritance_column = nil을 추가 생각합니다. 시도하지 않았습니다. 내 권고안은 레일 협약을 따르고 그것을 피하는 것이지만.

당신은 자세한 내용 here

희망이 사람을 도움을 찾을 수 있습니다. 건배 :)

관련 문제