从循环中重构关联

时间:2013-04-12 00:14:35

标签: ruby-on-rails refactoring associations

刚开始使用rails并尝试重构我的观点,我有点难过到哪里去找答案,因为我在每个循环内部我需要访问| item |

我正在使用创建者表格和书籍的HABTM关联从CSV文件中提取作者。原因有时作家也是插画家和编辑,我不想为书籍作者的每个特定角色提供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)

然后我复制了艺术家,编辑等...

我首先在控制器中尝试了@books,但我需要知道循环中的哪本书。我不确定下一步要学习,所以我可以删除丑陋。我已经看到很多我想要阅读的内容,但不确定哪个适合这种需要。助手?命名范围?

1 个答案:

答案 0 :(得分: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方法,虽然这会有点复杂,除非您计划更改创建者,否则可能不值得。)