rails,如何在功能上传递自我

时间:2012-04-23 04:41:05

标签: ruby-on-rails parameters self

消息和用户。我的消息belongs_to用户和用户has_many消息。

在我的一个观点中,我称之为

current_user.home_messages?

在我的用户模型中,我有......

  def home_messages?
    Message.any_messages_for
  end

最后在我的留言模型中,我有

scope :any_messages_for

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

我一直试图在我的消息模型中获取current_users id。我可以从我的视图中传递current_user作为参数,但是因为我正在做

current_user.home_messages?

我认为如果我使用自己会更好。但我该如何正确引用呢?

谢谢。

3 个答案:

答案 0 :(得分:7)

你可以使用lambda。在您的消息模型中:

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

这样可以这样工作:

Message.any_messages_for(current_user)

如果找到任何消息,您可以向用户模型添加一个方法以返回true。在这种情况下,您使用实例方法并将实例作为self传递:

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

但实际上,我只是在User模型中执行类似的操作,而无需编写上述任何内容。这使用在声明:has_many和:belongs_to associations:

时创建的Rails方法
def home_messages?
  return true if self.messages.any?
end

答案 1 :(得分:2)

您可以执行以下任一操作

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

要调用以上方法

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

要调用以上方法

current_user.any_messages_for

答案 2 :(得分:1)

你的Message类中的这些东西没有多大意义:

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

你应该在Message中有更多这样的东西:

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

然后在用户中:

def home_messages?     Message.any_messages_for(个体经营)   端

完成所有操作后,您可以说current_user.home_messages?