2013-10-14 2 views
0

Ruby on Rails를 사용하고 있습니다.Ruby on Rails에서 외래 키를 정의하는 방법

외래 키의 정의에 대해 몇 가지 질문이 있습니다.

일부 모델을 정의했습니다.

ISBN을 통해 Trade 클래스에서 책 제목에 액세스 할 때.

trade = Trade.first 
trade.isbn #=> just get isbn in case 1. 
trade.isbn.title #=> get book title in case 2. 

왜 2가 예상대로 작동하지 않습니까 ??

class Trade < ActiveRecord::Base 
    attr_accessible :cost, :isbn, :shop_id, :volume 

# belongs_to :book, foreign_key: "isbn" # case 1 
    belongs_to :isbn, class_name: :Book, foreign_key: :isbn # case 2 
    belongs_to :shop 
end 

class Author < ActiveRecord::Base 
    attr_accessible :age, :name 

    has_many :books 
    has_many :trades, through 
end 

class Book < ActiveRecord::Base 
    self.primary_key = :isbn 
    attr_accessible :author_id, :cost, :isbn, :publish_date, :title 

    belongs_to :author 
end 

class Shop < ActiveRecord::Base 
    attr_accessible :name 

    has_many :trades 
end 
+2

귀하의 궁금한 점은 무엇입니까? –

+0

두 정의의 차이점을 알고 싶습니다. –

+0

도와주세요. 관련 코드 만 포함하도록 질문을 편집하십시오. 실제로 실행중인 코드는 "작동하지 않습니다", 작동하지 않는 방법에 대한 구체적인 설명, 얻은 실제 출력 샘플 및 예상 한 출력을 포함해야합니다. –

답변

2

나는 당신이 무엇을 요구하고 있는지, 어떤 행동을 보는지, 어떤 행동을 기대했는지 완전히 모른다. 즉,이 당신이 붙여 넣은 코드에서 일어나는 일입니다 말했다 (경우 2?) :

trade = Trade.first 
trade.isbn 

Trade#isbn에 의해 참조 Book 인스턴스를 반환합니다.

trade.isbn.title 

Trades#isbn에 의해 참조 Book 인스턴스의 제목을 반환

book = trade.isbn 
book.title 

에 해당합니다. 이게 네가 예상 한 것이 아닌가?

+0

내 질문에 답변 해 주셔서 감사합니다. case1과 case2가 같다고 생각합니다. 사례 1에서 책 제목에 액세스하고 싶습니다. –

+0

"케이스 1"이 무슨 뜻인지 잘 모르겠습니다. 죄송합니다. 아마도 'trade.book.title'을 요구할 것입니까? –

+0

예 케이스 1에서 trade.book.title이 작동하지 않는 이유를 알고 싶습니다. –

0

그럼 기호 (:isbn)와 문자열 ("isbn")의 차이점은 무엇입니까? 총 상징에서 당신은 더 많은 읽을 수 있습니다 여기에 Rubys 불변의 문자열로 간주됩니다 : 일반 협약에

http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/

당신 옵션 내부 키로 기호를 사용하는 것입니다 당신은 어떤 libs와/보석 불구 등의 방법으로 지원을 전달할 것을 해시 양자 모두. 그러나 Yours의 특별한 경우에는이 값이 문자열로 타입 변환되고있는 것처럼 보이므로 foreign_key에 대한 옵션으로 전달 된 모든 내용이 to_s을 사용하여 문자열로 변환됩니다.

관련 문제