Ruby on rails 从循环中重构视图外的关联

Ruby on rails 从循环中重构视图外的关联,ruby-on-rails,refactoring,associations,Ruby On Rails,Refactoring,Associations,刚开始使用rails并尝试重构我的一些视图,我有点不知所措,因为我在每个循环中,需要访问| item | 我使用creator表和HABTM与书籍的关联,从CSV文件中提取writer。原因是有时作者既是插图画家又是编辑,我不希望一个书作者的每一个特定角色都有3张(甚至更多)表格 图书模型(带CSV导入) 然后我为艺术家、编辑等复制了这个 我首先在控制器中尝试了@books,但我需要知道循环中的哪本书。我不确定下一步要学什么,这样我才能去掉丑陋的东西。我看过很多我想去读的东西,但不确定哪一个适合

刚开始使用rails并尝试重构我的一些视图,我有点不知所措,因为我在每个循环中,需要访问| item |

我使用creator表和HABTM与书籍的关联,从CSV文件中提取writer。原因是有时作者既是插图画家又是编辑,我不希望一个书作者的每一个特定角色都有3张(甚至更多)表格

图书模型(带CSV导入)

然后我为艺术家、编辑等复制了这个


我首先在控制器中尝试了@books,但我需要知道循环中的哪本书。我不确定下一步要学什么,这样我才能去掉丑陋的东西。我看过很多我想去读的东西,但不确定哪一个适合这个需要。帮手?命名范围

这里的复杂性部分是通过使用
writer\u id
等来引入的,而不是实际的关联,这可能会使事情变得更容易一些。但是,如果您打算坚持当前的结构,您所拥有的可能与您想要的非常接近,尽管您可能希望将
链接\u改为
行,使其更简单:

link_to book.creators.find(book.writer_id).name, creator_path(book.writer_id)
另一个选项是在模型中为writer和illustrator设置自定义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方法,尽管这会有点复杂,除非您计划更改创建者,否则可能不值得这么做。)

您遇到的实际问题是什么?这个问题有点含糊不清。如果应用程序按我想要的方式运行,这并不是什么问题,但与其他大多数事情的简单程度相比,我似乎做得不对。因为我才刚刚开始,所以我正在尝试学习最佳实践,模型和视图中都有很多重复,但我不知道如何更改才能使其更好。getter看起来很不错,谢谢!除了rails之外,我肯定还需要更多地了解ruby类。一个真正的联合会需要什么?我正在使用books_creators表来关联书籍和创建者,但我需要一些方法来确定哪位创建者在每本书上扮演哪一个角色。As:通过与“创造者”的联系,或者一些对我来说不太有意义的事情。
link_to book.creators.find(book.writer_id).name, creator_path(book.writer_id)
# 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)