2013-04-11 2 views
0

나는 comic_books 테이블을 가지고 있는데, 각 테이블에는 현재 author and illustrator이 있으며, 현재는 문자열로만 저장되어 있습니다. 이 문제에 대한 comic_books에 has_many:through을 사용하면 큰 효과가 있습니다. 이제 저자와 일러스트 레이터의 연관성을 추가하는 방법을 알아 내려고합니다.first_or_create와 중첩 관계에있는 레일

문제는 저자와 일러스트 레이터가 때때로 같은 사람이라는 것입니다. 일러스트 레이터를 클릭하면 필자가 작성했거나 일러스트 한 특정 문제를보고 싶습니다. 설치 한 경우 has_one belongs_to association 일러스트레이션이나 저자의 볼륨 결과 만 가져올 수 있지만 같은 "작성자"의 두 가지 모두를 원합니다.

그래서 내가 테이블 을 시험해 보도록 이끌어 주지만, 연관을 배치하는 방법을 알 수는 없습니다. 작성자와 일러스트레이터 모두에 namecreator_id을 저장하는 제작자 테이블을 원합니다.

그럼 난

issue.illustrator.first_or_create!('bob smith') 

를 호출하고 싶습니다하지만 그것은 옳지 않아. 독립 일러스트 레이터 및 작가 테이블은 각각에 동일한 이름을 갖기 때문에 필자는 독립적 인 일러스트 레이터 및 작성자 테이블을 원하지 않습니다. 나는 그것을 더 추상화 할 필요가 있지만 그것을 이해하는 것처럼 보일 수는 없다.

일러스트 레이터 테이블에 creator_id을 저장하고 issue.illustrator.name을 참조 할 수 있도록 새로운 작성자 레코드를 만들고 싶지만 이름 값이 실제로 작성자 테이블에있는 것 같습니다.

전체적으로 작업을 수행하는 데 더 좋은 방법이 있습니까?

일러스트 레이터를 할당하도록 시도와 관련하여
+0

더 많은 것을 생각하면할수록 더 많은 단어가 "사용"대신 "사용"됩니다. 작가는 크리에이터이지만 많은 것을 가지고 있지 않다 ... 하지만 난 아직 사용자 지정 레일 상속을 만드는 방법에 대해 배웠다. – tehfailsafe

답변

0

, 당신은 아마이 대신 같은 것을 할 싶어 :

issue.illustrator = Illustrator.first_or_create(name: "Bob Smith") 

이 사용하고 있었는지 모델에 따라. 나는 당신이 가지고있는 모델과 거기에서 마지막으로 자신들의 결속을 어떻게 구성하고 있는지에 관해서는 조금 길을 잃었다. 아마이 상황을 처리 할

방법은, 저자와 일러스트 레이터 모두에 대해 Creator 클래스를 사용하는, 그리고 Issues 특정에 연결하는 (예를 들어, Involvement 전화) 세 번째, 상호 참조 모델을 사용 그 세 번째 모델에서 그들의 역할이 무엇인지 명시하십시오. (당신이 Issue에 의해 저자/일러스트 레이터를 추적처럼 소리부터, Comic 무시) 협회는 다음과 같이 보일 것이다 :

class Issue < ActiveRecord::Base 
    has_many :involvements 
    has_many :creators, through: :involvements 
    ... 
end 

class Creator < ActiveRecord::Base 
    has_many :involvements 
    has_many :issues, through: :involvements 
    ... 
end 

class Involvement < ActiveRecord::Base 
    belongs_to :issue 
    belongs_to :creator 

    # This model would then have an extra property to store the type of involvement 
    # ie. author, illustrator, author/illustrator 
    attr_accessible :type, ... 
end 

(내 성향은 Involvement에 비트 마스크의 정수를 type 속성을 확인하는 것입니다, 그래서 그것은 저자에 대한 1, 일러스트 레이터에 대한 2, 저자/일러스트 레이터에 대한 3 수 있습니다)

이 방법은, 다음과 함께 IssueCreator를 추가 할 수 있습니다.

inv = Issue.involvements.create(type: ...) # Whatever's appropriate 
inv.creator = Creator.find_or_create('Bob Smith') 
+0

"creatorship"시도 : 제작자 모델의 연관성을 통해,하지만 issue.illustrator = Creator.find_or_create를 사용하여 만들려고 할 때 클래스 불일치 오류가 발생했습니다. 하지만 다른 인스턴스에서 전달하는 방법을 본 것 같아서 생각하지 않았습니다. 나는 간단하게 협회를 직접 만드는 대신에 더 (comic.issue.illustrator.creator) 둥지를 튼튼히하려고 노력했다. .. 굉장한! 나는 내일 그것을 시험 할 것이다! – tehfailsafe

+0

필자는 writer_id, artist_id 등을 통해 전달되는 이슈와 제작자 테이블 사이에 HABTM 연관성을 만들었습니다. DB 측면에서는보기 흉하고 모델에 대해 매우보기 흉하게 보입니다. 나는 후속 조치로서 새로운 질문을 올렸다. http://stackoverflow.com/questions/15961029/refactor-association-out-of-view-from-a-loop – tehfailsafe

+0

아, 제 생각에 어떻게하면 아티스트 ID 등을 사용했는지 알 것 같습니다. '문제'의 속성으로, 맞습니까? 그것도 작동합니다. 당신이 그렇게하는 것을 잃어 버릴 것 한 가지는 크리에이터의 작품을보고 그들이 예술가이든, 작가이든간에 볼 수있는 좀 더 뒤죽박죽이 될 것이지만, 그것은 당신을위한 우선 순위가 될 것입니다 :) 나는 ' 귀하의 다른 질문을 살펴보고 도움을 드릴 수 있는지 확인하십시오. –