2013-04-12 24 views
0

剛開始在軌並試圖重構了一點我的看法,而我有點難倒到哪兒去尋找答案,因爲我每個循環內的我需要訪問| item |。重構聯想出來的觀點從一個循環

我從一個CSV文件中提取的作家,用創作者表,並與書籍HABTM ASSOCATION。原因是有時筆者也插畫,也是編輯,我不想一書的作者的每一個特定的角色3(更可能)表。

圖書模型(通過CSV導入)

writer = Creator.where(name: row['writer']).first_or_create!(row.to_hash.slice(:writer)) 
    book.creators << writer 
    book.writer_id = writer.id 

圖書搜索

books.each do |book| 
    link_to book.creators.detect{|w| w.id == book.writer_id}.name, creator_path(id: book.writer_id) 

然後我重複,對於藝術家,編輯等..

我第一次嘗試了@控制器中的書籍,但我需要知道循環中的哪本書。我不知道下一步要了解,以便我可以刪除醜陋的。我已經看到很多我想要閱讀的內容,但不確定是否適合這種需求。助手?命名範圍?複雜的

+0

您遇到的實際問題是什麼?這個問題有點模糊。 –

+0

如果應用程序按照我想要的方式工作,這並不是一個問題,但似乎我沒有做正確的事情,相比之下其他所有事情都是如此簡單。 因爲我剛剛開始嘗試學習最佳實踐,並且模型和視圖中都存在大量重複,但我不知道如何改變以使其更好。 – tehfailsafe

回答

0

此部分由事實介紹了使用writer_id等,而不是實際的關聯,這很可能會令事情變得更容易一些。如果你要與當前的結構,堅持,雖然,你有什麼可能是非常接近你想要什麼,雖然你可能想改變這種link_to線更簡單:

link_to book.creators.find(book.writer_id).name, creator_path(book.writer_id) 

另一種選擇是爲模型中的作家和插畫設置自定義的getter方法,這將讓您簡化的東西,甚至更多:

# book.rb 
def writer 
    creators.find(writer_id) # This should allow you to still eager load it if you want 
end 

def illustrator 
    creators.find(illustrator_id) 
end 

# in your view 
link_to book.writer.name, creator_path(book.writer_id) 

(你也可以寫setter方法,雖然這將是更復雜一點,可能不值得除非你打算改變的創造者。)

+0

吸氣劑看起來非常好,謝謝!除了rails之外,我一定需要更多地關注ruby類。 什麼將一個實際的關聯意味着什麼?我正在使用books_creators表關聯書籍和創作者,但我需要一些方法來確定哪個創作者在每本書上擁有哪個角色。因爲:通過與「創作者」的關聯或者某種東西似乎對我來說似乎沒有意義。 – tehfailsafe