2012-02-02 3 views
3

私は以前に尋ねられたことを知っていますが、私はそれを行う方法を理解できません。私は熱心な質問と回答への影響をロードしようとしていますが、現在のユーザーだけが、ユーザーがアイテムに投票したかどうかをチェックすると考えています。イベントは基本項目です。私は好ましくは結合なしでこれをやりたい。私が試したことはある参加しないで熱心なローディングに条件を付けるには?

Event has many Questions 
Question has many Answers 

Event has many influences 
Question has many influences 
Answer has many influences 

event.questions.includes(:answers, :influences) 

しかし、これはすべての影響だけでなく、current_usersを取得する私のモデルは、のように見えます。私はその影響のスコープを試してみましたが、うまくいかないようです。影響の代わりに使うことができる 'users_influences' has_many関連付けを定義しようとするのは本当に苦労しました。

私はこれらの影響表を明確にするために、これらの他のさまざまなエンティティにユーザーを接続する、ラインアイテムのようなビットです。これは可能です参加しないで?

答えて

2

モンキーは、要求コンテキスト内で、現在のユーザーを設定するために、あなたのapplication_controller.rbbefore_filterを追加ActiveRecord::Base

configuration\initializers\monkey_patches.rb
class ActiveRecord::Base 

    # Use thread local variables to store the context. 
    def self.current_user=user 
    Thread.current[:current_user]= user 
    end 

    def self.current_user 
    Thread.current[:current_user] 
    end 

    def current_user 
    ActiveRecord::Base.current_user 
    end 

end 

にパッチを適用します。

class ApplicationController < ActionController::Base 
    before_filter :init_app_request 

    def init_app_request 
    ActiveRecord::Base.current_user = current_user # set the current user 
    end 
end 

Questionモデルであなたの関連付けを変更してください。現在のユーザーに基づいて影響をフィルタリングするcurrent_user_influencesという新しい関連付けを追加します。

class Question 

    has_many :influences, 

    # use single quotes for the `conditions` string to avoid interpolating 
    # the string during class loading. 

    has_many :current_user_influences, :class_name => "Influence", 
      :conditions => '#{current_user_check}' 

    def current_user_check 
    current_user ? "influences.user_id = #{current_user.id} " : "" 
    end 
end 

今することができます熱心な負荷current_user_influences

questions =event.questions.includes(:answers, :current_user_influences) 
# influences pertaining to the current user 
questions.first.current_user_influences 
+0

うわーは、どのような素晴らしい答えをありがとう。あなたはこのコミュニティの資産です。ありがとう。 – Inc1982

+0

@ Inc1982ソリューションがあなたのために働いたかどうか教えていただけますか?私はソリューションをコーディングしました。私は現在のソリューションにエラーがある場合、その答えを更新したいと思います。 –

+0

@HarishShetty、ちょうどインスタンス変数の代わりにThread.currentがなぜですか?違いは? – Chamnap

関連する問題