0

現在、文字列としてのみ保存されている、多くの問題があるcomic_booksテーブルがあります。author and illustrator問題に comic_books を使用has_many:throughするとうまくいきます。現在、著者とイラストレーターの関連付けを追加する方法を見つけようとしています。

問題は、著者とイラストレーターが同一人物である場合があることです。イラストレーターをクリックすると、彼/彼女が書いた、またはイラストを描いた特定の問題を確認したいと思います。セットアップするhas_one belongs_to associationと、イラストまたは著者のいずれかのボリューム結果のみが取得されますが、同じ「作成者」から両方が必要です。

そのため、テーブルを試してみましたcreatorが、関連付けを配置する方法がわかりません。ライターとイラストレーターの両方nameに 、 、を格納するクリエーター テーブルが必要です。creator_id

じゃあ電話したい

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

しかし、それは正しくありません。それぞれに同じ名前が付けられるため、独立したイラストレーターとライターのテーブルは必要ありません。さらに抽象化する必要がありますが、理解できないようです。

creator_idissue.illustrator.nameを参照できるように、作成者レコードが存在しない場合は新しい作成者レコードを作成してillustratorテーブルに保存したいと思いますが、名前の値は実際には作成者テーブルにあります...

全体的にタスクを実行するためのより良い方法はありますか?

4

1 に答える 1

1

イラストレーターを割り当てようとする試みに関しては、おそらく代わりに次のようなことをしたいと思うでしょう:

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

使用していたモデルによって異なります。あなたが持っているモデルと、そこの最後に向かってそれらの関連付けをどのように構築しているかについて、私は少し迷いました.

おそらくこの状況に対処する方法はCreator、著者とイラストレーターの両方にクラスを使用し、3 番目の相互参照モデル (たとえば、 を呼び出すInvolvement) を使用してそれを特定の にリンクしIssues、彼らの役割が何であるかを指定することです。そのサードモデル。Comic関連付けは次のようになります (によって作者/イラストレーターを追跡しているように聞こえるため、 は無視しますIssue):

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

(私の傾向としては、ビットマスクされた整数でtypeプロパティを作成することです。そのため、作成者、イラストレーター、および作成者/イラストレーター向けになる可能性があります。)Involvement123

このようにして、次のように aCreatorを anに追加できます。Issue

inv = Issue.involvements.create(type: ...) # Whatever's appropriate
inv.creator = Creator.find_or_create('Bob Smith')
于 2013-04-11T06:39:49.190 に答える