2

消息和用户。我的消息属于_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?

我认为如果我使用self会更好。但是我该如何正确地引用它呢?

谢谢你。

4

3 回答 3

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 关联时创建的 Rails 方法:

def home_messages?
  return true if self.messages.any?
end
于 2012-04-23T05:14:29.710 回答
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

或者

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

调用上述方法你必须做

current_user.any_messages_for
于 2012-04-23T04:49:28.340 回答
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(self) 结束

一旦所有这些都整理好,你就可以说current_user.home_messages?

于 2012-04-23T04:52:27.393 回答