从不同的角度调用模型方法

时间:2015-06-01 04:01:44

标签: ruby-on-rails ruby methods model

我有一个模型方法

def full_name_find(user_id)
   user = User.find(user_id)
   "#{user.first_name} #{user.last_name}"
end

User模型中。我想从另一个视图(门票#show)中调用它,我似乎无法让它工作。

我试过了:

<%= User.full_name_find(comment.user_id) %>

其中comment有user_id。我得到undefined method 'full_name_find' for #<Class:0x007fd188e41108>。当我将full_name_find方法粘贴到应用程序帮助器并在视图中调用时,我才能使它工作:

<%= full_name_find(comment.user_id) %>

它有效。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您可以通过将其设为类方法来实现它,即将self.放在其名称之前:

def self.full_name_find(user_id)
   user = find(user_id)
   "#{user.first_name} #{user.last_name}"
end

User.full_name_find(123)
# => "Jane Doe"

......但这很奇怪。在一个应该返回用户名的方法中进行数据库操作(User.find)是没有意义的。一个更惯用的方法是一个简单的实例方法,它将使您能够获得任何用户实例的全名:

class User < ActiveRecord::Base
  # ...
  def full_name
    "#{first_name} #{last_name}"
  end
end

然后,在您看来:

<%= comment.user.full_name %>

由于上述原因这更好(更不用说简单了),但也因为当您加载评论时,您可以使用includes来加载相关用户(例如{{1}因此,您不必执行大量额外的数据库请求来获取用户的名称。