2013-04-11 79 views
0

我有一个comic_books表有很多问题,其中每个有author and illustrator,目前仅存储为字符串。使用has_many:through for comic_books来解决问题的效果很好,现在我试图找出如何为作者和插画师添加关联。Rails嵌套协会与first_or_create

问题是作者和插画家有时是同一个人。如果您点击插图画家,我希望看到他/她编写或说明的具体问题。如果我设置了has_one belongs_to association,我只会获得插图或作者的音量结果,但我希望来自同一个“创作者”。

因此,这导致我试着creator表,但我无法弄清楚如何放置关联。我想要一个创作者表,它将namecreator_id存储在作家和插图画家中。

然后我想打电话

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

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

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

难道只有更好的方法来完成整个任务吗?

+0

我越想越想用“IS a”而不是“HAS a”这个词。作家是一个创作者,没有多少... 但是我还没有学到任何有关创建自定义rails继承的知识,但是,这是正确还是过度思考呢? – tehfailsafe 2013-04-11 05:44:20

回答

0

至于你尝试分配一个插画家,你可能想要做这样的事情,而不是:这取决于你用什么样的模式

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作者/插画)

这种方式,你可以添加一个CreatorIssue有以下几点:

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

我确实尝试过“创作者”:通过关联创作者模型,但是当我尝试使用issue.illustrator = Creator.find_or_create创建它时,我得到了一个类不匹配错误。 但我想我明白你是如何从另一个实例传递它的,我没有想到这一点。我试图进一步嵌套(comic.issue.illustrator.creator),而不是直接创建关联...太棒了!我明天会试一试! – tehfailsafe 2013-04-11 07:04:33

+0

我最终创建了问题和创建者表之间的HABTM关联,传递了writer_id,artist_id等。在数据库方面看起来非常干净,在视图和模型上非常潦草。我作为后续发布了一个新问题。 http://stackoverflow.com/questions/15961029/refactor-association-out-of-view-from-a-loop – tehfailsafe 2013-04-12 01:22:32

+0

啊,我想我明白你是怎么过去的,用'artist_id'等等。作为'问题'的属性,对吗?这也起作用。你会失去这样做的一件事情是看看创作者的作品,看看他们是艺术家还是作者等等,但这可能会成为你的优先考虑。我会看看你的其他问题,看看我能否提供任何帮助。 – 2013-04-12 01:49:43