0

我有一个comic_books有很多问题的表,每个问题都有一个author and illustrator,当前仅存储为字符串。使用has_many:through漫画书来解决问题效果很好,现在我正在尝试弄清楚如何为作者和插画家添加关联。

问题是作者和插画家有时是同一个人。如果您单击插画家,我想查看他/她所写或插图的具体问题。如果我设置一个has_one belongs_to association我只会得到插图或作者的卷结果,但我想要来自同一个“创作者”。

所以这导致我尝试了一张creator桌子,但我不知道如何放置关联。我想要一个在作家和插画家中存储name, 和 a的创建者表。creator_id

然后我想打电话

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

但这是不对的。我不想要独立的插画家和作家表,因为他们每个人都有相同的名字。我需要进一步抽象出来,但我似乎无法弄清楚。

我想如果不存在,我想创建一个新的创建者记录并存储creator_id到 illustrator 表中,以便我可以引用 issue.illustrator.name,但名称值实际上是在创建者表中......

有没有更好的方法来完成整个任务?

4

1 回答 1

1

关于您尝试分配插画家的尝试,您可能想要做这样的事情:

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

取决于您使用的型号。我对你有什么模型以及你最终如何构建它们的关联有点迷失了。

我可能会处理这种情况的方式是Creator为作者和插画家使用一个类,并使用第三个交叉引用模型(例如,调用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上创建属性Involvement,因此它可能1适用于作者、2插画家和3作者/插画家。)

这样,您可以使用以下内容将 a 添加Creator到 an Issue

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