2013-04-11 100 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