Ruby on rails 与第一个\u或\u创建的轨道嵌套关联

Ruby on rails 与第一个\u或\u创建的轨道嵌套关联,ruby-on-rails,associations,has-many-through,has-many,Ruby On Rails,Associations,Has Many Through,Has Many,我有一个漫画书表,其中有许多问题,每个问题都有一个作者和插图画家,目前仅存储为字符串。使用有很多:通过来发行漫画书效果很好,现在我正试图找出如何为作者和插图画家添加关联 问题是,作者和插图画家有时是同一个人。如果你点击一个插图画家,我想看看他/她写的或插图的具体问题。如果我设置了一个有一个属于关联我只会得到插图或作者的结果,但我希望两者都来自同一个“创建者” 因此,我尝试了一个creator表,但我不知道如何放置关联。我想要一个creator表来存储writer和illustrator中的名称,

我有一个
漫画书
表,其中有许多问题,每个问题都有一个
作者和插图画家
,目前仅存储为字符串。使用
有很多:通过
来发行漫画书效果很好,现在我正试图找出如何为作者和插图画家添加关联

问题是,作者和插图画家有时是同一个人。如果你点击一个插图画家,我想看看他/她写的或插图的具体问题。如果我设置了一个
有一个属于关联
我只会得到插图或作者的结果,但我希望两者都来自同一个“创建者”

因此,我尝试了一个
creator
表,但我不知道如何放置关联。我想要一个creator表来存储writer和illustrator中的
名称
,以及
creator\u id

那我想打个电话

issue.illustrator.first_or_create!('bob smith')
但这是不对的。 我不想要独立的插画家和作家表,因为他们在每个表中都有相同的名字。我需要把它进一步抽象出来,但我似乎无法理解

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


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

关于您分配illustrator的尝试,您可能希望执行以下操作:

issue.illustrator = Illustrator.first_or_create(name: "Bob Smith")
取决于您使用的型号。我有点不明白你有什么模型,以及你是如何在最后构建他们的关联的

我处理这种情况的方法可能是为作者和插图画家使用
Creator
类,并使用第三个交叉引用模型(例如,调用
参与
)将其链接到特定的
问题
,并指定他们在第三个模型中的角色。关联看起来是这样的(忽略
漫画
,因为听起来像是通过
问题
跟踪作者/插图画家):


我想得越多,就越想用“是一个”来代替“有一个”。作家是创造者,没有多少。。。但是我还没有学到任何关于创建自定义rails继承的知识,这是正确的还是考虑过了?我确实尝试了“creatorship”:通过creators模型上的关联,但是当我尝试使用issue.illustrator=Creator.find_或_create创建它时,我遇到了一个类不匹配错误。但我想我看到了你是如何从另一个例子中传递它的,我没有想到这一点。我试图进一步嵌套(comic.issue.illustrator.creator),而不是直接创建关联。。。令人惊叹的!我明天会测试它!我最终只是在问题和创建者表之间创建了一个HABTM关联,传递了writer\u id、artist\u id等。在DB端看起来非常干净,在视图和模型上非常松散。我贴了一个新问题作为跟进。啊,我想我知道你是怎么做的了,用
artist\u id
等作为
问题的属性,对吧?这也行。这样做会让你失去一件事,那就是看一个创作者的作品,看看他们是艺术家还是作家,或者其他什么,这会让你更加困惑,但这可能是你的优先事项:)我会看看你的另一个问题,看看我是否能提供任何帮助。
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
inv = Issue.involvements.create(type: ...) # Whatever's appropriate
inv.creator = Creator.find_or_create('Bob Smith')