如何在 rails for 循环中应用得墨忒耳定律

How to apply law of demeter in a rails for loop

我有一个 rails 应用程序,它的用户模型有一个 User_profile。当我想在一个页面上显示多个用户时,我使用 rails 循环,例如:

<% @users.each do |user| %>
  <%= user.user_profile.city %>
<% end %>

显示用户居住城市。然而,这并不遵循得墨忒耳法则(或者我的 bitbucket 上的詹金斯告诉我)。我可以在我的用户模型上创建一个城市范围,以便我可以调用 user.user_profile_city,但我不知道这是否是解决此问题的最佳方法,因为我必须为每个 user_profile 执行此操作属性(哪一种使得 user_profile table 无用)。 Rails 解决这个问题的方法是什么?

不需要添加作用域,可以使用delegate。将此添加到您的 User 模型中:

delegate :city, to: :user_profile

然后你的视图变成

<% @users.each do |user| %>
  <%= user.city %>
<% end %>

查看 http://api.rubyonrails.org/classes/Module.html#method-i-delegate 了解更多详情。