2016-08-02 23 views
0

私は、User、Profile、Organization Requestのモデルを持っています。団体は次のとおりです。Rails関連するメソッドにアクセスするための4連鎖モデルの関連付け

ユーザー

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メソッドにアクセスしようとしています。

私は私の組織で次のメソッドを書くことによってモデルを要求することをやろうとしている:

  <%= link_to orgReq.related_user_name, organisation_request.profile_path(organisation_request.profile.id) %> 
:私は私の組織でこれを使用しようとすると

def related_user_name 
    self.profile.user.full_name 
end 

はこのように、インデックスを要求します

私が言うエラーが出る:私はレールの共同でこのアイデアを使用しようとすると

undefined method `user' for nil:NilClass 

をnsole:

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" 

コンセプトはコンソールで動作するようですか? 誰かが間違っていた場所を見ることができますか?

答えて

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を呼び出すことができ、それがプロファイル>ユーザーを通過し、full_nameを呼び出します(そして、あなたがallow_nil: true以来undefinedを取得することはありません

delegate hereの詳細情報です。

+0

私はこれを試しましたが、エラーメッセージを表示します Mel

+0

のための未定義のローカル変数またはメソッド 'user '' 'Profile'と' delegate:user_full_name、〜に 'delegate:full_name to:user、prefix:true、allow_nil: ::profile、prefix:false、allow_nil:true'を返します。 – dpedoneze

-1

組織のすべてのリクエストにプロファイルがあることを確認しましたか?これはベストプラクティスではない可能性があります。profile.try(:user).try(:full_name)

+0

私が言ったように、そのようなチェーンメソッドは悪い習慣です。最良の選択は常に 'method.call_another'のような1つの呼び出ししかありません:) – dpedoneze

関連する問題