0

刚开始使用rails 并试图重构我的一些观点,我有点不知道去哪里寻找答案,因为我在每个循环中,我需要访问|item|。

我正在从 CSV 文件中提取作者,使用创建者表和 HABTM 与书籍的关联。原因有时作者既是插画家又是编辑,我不想为书籍作者的每个特定角色提供 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,但我需要知道循环中的哪本书。我不确定下一步要了解,所以我可以删除丑陋的东西。我已经看到了很多我想阅读的东西,但不确定哪一个适合这种需要。帮手?命名范围?

4

1 回答 1

0

这里的部分复杂性是通过使用writer_idetc. 而不是实际关联这一事实引入的,这可能会使事情变得更容易一些。但是,如果您要坚持当前的结构,那么您所拥有的可能与您想要的非常接近,尽管您可能希望将该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 方法,尽管这会稍微复杂一些,并且可能不值得,除非您打算更改创建者。)

于 2013-04-12T03:35:26.190 回答