2012-04-23 6 views
1

メッセージとユーザー。私のメッセージはbelongs_toユーザーとユーザーhas_manyメッセージです。私のビューのいずれかでレール、機能で自己を渡す方法

、私は

私のメッセージ・モデルの
def home_messages? 
    Message.any_messages_for 
    end 

そして最後に...私は、

current_user.home_messages? 

と私のユーザモデルのような何かを呼び出す、私は

を持っています
scope :any_messages_for 

    def self.any_messages_for 
     Message.where("to_id = ?", self.id).exists? 
    end 

ive私のメッセージモデルでcurrent_usersのIDを取得しようとしました。私は上に私のビューからのパラメータとしてcurrent_userに渡すことができますが、私はやって以来

current_user.home_messages? 

私は自己を使用すると良いと思った。それを正しく参照するにはどうすればいいですか?

ありがとうございました。

答えて

6

ラムダを使用できます。あなたのメッセージモデルで:

scope :any_messages_for, lambda {|user| where('user_id = ?', user.id)} 

これには、同じように動作します:

Message.any_messages_for(current_user) 

そして、あなたはすべてのメッセージが見つかった場合はtrueを返すように、ユーザーモデルにメソッドを追加することができます。この場合、あなたはインスタンスメソッドを使用して、自己としてインスタンスに渡します

def home_messages? 
    return true if Message.any_messages_for(self) 
end 

をしかし、実際に、私は上記のいずれかを記述することなく、ユーザーモデルでは、このような何かをしたいです。団体belongs_toの::has_manyのと:これは、宣言するときに作成されたRailsのメソッド使用しています、私は個人的に二番目のを好む

def home_messages? 
    return true if self.messages.any? 
end 
+0

ありがとうございました。私は助けに感謝します! – Sasha

+0

問題はありません。うれしく思っています。私は、最後の方法で '真の場合'を返す必要はないことに注意してください。あなたはただself.messages.anyを書くことができますか? – robotcookies

2

あなたは、あなたがしなければならないメソッドの上に呼び出すことが

User.any_messages_for(current_user.id) #I am assuming any_messages_for is in `User` Model 

OR

def any_messages_for #This is a instance method 
    Message.where("to_id = ?", self.id).exists? 
end 

をしなければならないメソッドの上に呼び出すには、次の

def self.any_messages_for(id) #This is a class method 
    Message.where("to_id = ?", id).exists? 
end 

のいずれかを行うことができます

あなたのメッセージクラスで10
+0

を....また、ルビーメソッドの命名規則によると、あなたは 'を置く必要があります'、あなたの目の前に?あなたの場合、メソッド名は 'any_messages_for?'または 'has_any_message? 'のようなものでなければなりません – Salil

+0

本当にありがとうございます。私は助けに感謝します! – Sasha

1

このようなものは、多くの意味がありません:

scope :any_messages_for 

def self.any_messages_for 
    Message.where("to_id = ?", self.id).exists? 
end 

scopeマクロが独自にクラスメソッドを定義し、同様にそれに別の引数があるはずです。また、スコープは、クエリーパラメータのセットを多かれ少なかれ定義することを意図していますので、any_messages_forメソッドはあまり有効ではありません。私はあなたがscope :any_messages_forを取り除くべきだと思います。あなたany_messages_forクラスメソッドで

selfのでself.idユーザIDではありませんので、それはあなたのwhereのプレースホルダ値として有用ではないであろうクラス自体であろう。ユーザーで

def self.any_messages_for(user) 
    where('to_id = ?', user.id).exists? 
    # or exists?(:to_id => user.id) 
end 

そして:

デフhome_messages

あなたはメッセージでこのような多くの何かを持っている必要がありますか? Message.any_messages_for(自己) end

すべてがソートされたら、current_user.home_messages?と言うことができます。

+0

ありがとう。私は助けと説明を感謝します! – Sasha

関連する問題