Rails 4 - 链接模型关联以访问相关方法

时间:2016-08-02 00:41:03

标签: ruby-on-rails model associations

我有用户,个人资料和组织请求的模型。协会是:

用户

has_one :profile, dependent: :destroy
has_one :organisation_request, through: :profile 
    accepts_nested_attributes_for :organisation_request

资料

belongs_to :user
belongs_to :organisation

组织申请

belongs_to :profile
# belongs_to :user#, through: :profile  
belongs_to :organisation

在我的用户模型中,我有一个名为full_name的方法(我用它来格式化用户名称的显示。

我试图在我的organisation_requests模型中访问该full_name方法。

我试图通过在我的组织请求模型中编写以下方法来实现这一点:

def related_user_name
    self.profile.user.full_name
end

当我尝试在我的组织请求索引中使用它时,如下所示:

          <%= link_to orgReq.related_user_name, organisation_request.profile_path(organisation_request.profile.id) %>

我收到错误消息:

undefined method `user' for nil:NilClass

当我尝试在rails控制台中使用这个想法时,使用:

o = OrganisationRequest.last

  OrganisationRequest Load (0.4ms)  SELECT  "organisation_requests".* FROM "organisation_requests"  ORDER BY "organisation_requests"."id" DESC LIMIT 1
 => #<OrganisationRequest id: 2, profile_id: 1, organisation_id: 1, created_at: "2016-08-01 22:48:52", updated_at: "2016-08-01 22:48:52"> 
2.3.0p0 :016 > o.profile.user.formal_name
  Profile Load (0.5ms)  SELECT  "profiles".* FROM "profiles" WHERE "profiles"."id" = $1 LIMIT 1  [["id", 1]]
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
 => " John Test" 

这个概念似乎在控制台中有效吗? 谁能看到我出错的地方?

2 个答案:

答案 0 :(得分:1)

不要链接方法,这是一种不好的做法,它违反了Law of Demeter。最好的选择是使用delegate。所以而不是:

def related_user_name
  self.profile.user.full_name
end

你可以:

class OrganisationRequest
  belongs_to :profile
  has_one :user, through: :profile

  delegate :full_name, to: :user, allow_nil: true, prefix: true
end

然后,您只需拨打organisation_request.user_full_name,即可查看个人资料&gt;用户并致电full_name(由于undefined将“覆盖”它,您将无法获得allow_nil: true

有关delegate here的更多信息。

答案 1 :(得分:-1)

您是否检查过所有组织请求都有个人资料?可能这不是最佳做法,请尝试使用profile.try(:user).try(:full_name)