0

根据哪些已被删除而不是未删除,找出一种为用户消息线程显示消息的方法时遇到了一些麻烦。删除消息时,已删除消息“sender_status 或接收者状态”将从 0 更改为 1。目前要在收件箱中显示用户消息线程列表,我使用:

例如

current_user = User.find(2)
current_user.message_threads

这会抓取所有具有 0 个发件人或收件人状态的 message_threads。

class User < ActiveRecord::Base

  has_many :messages
  has_many :message_threads

很好很容易,但我现在想做的是如何设置一些东西,使我能够从当前线程中获取具有 0 个发件人或收件人状态的消息。所以如果我要输入:

one_thread = current_user.message_threads.first

从这个线程中,我希望能够轻松获取我需要的唯一消息。想在 message_thread 模型中添加一些内容,以便我最终可以输入:

current_user.message_threads.first.messages

#or

one_thread.messages

并且只加载我需要的消息,而忽略状态为“1”的消息。

用户模型:

class User < ActiveRecord::Base

  has_many :messages
  has_many :message_threads

  def message_threads
    MessageThread.where([ '(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.id, self.id ])
  end

  def messages
    Message.where([ '(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.id, self.id ])
  end

消息线程模型:

class MessageThread < ActiveRecord::Base

  has_many :messages

消息模型:

  class Message < ActiveRecord::Base

    acts_as_tree
    has_one :message_thread

我尝试使用连接进行试验,但这对我来说效果不佳。

def messages
  joins(:messages).merge(  Message.where([ '(parent_id = ? AND sender_status = 0) OR (parent_id = ? AND recipient_status = 0)',self.message_id, self.message_id ]) )
end

帮助将不胜感激。

亲切的问候

4

1 回答 1

0

我猜问题是one_thread返回一个MessageThread对象,然后你试图通过调用来获取用户ID self.id,但它被错误的模型调用。

我没有尝试过这段代码,但它可能会起作用:

class User < ActiveRecord::Base
  def self.threads_in_inbox
    message_threads.where('(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.id, self.id)
  end
end

class MessageThread < ActiveRecord::Base
  def self.inbox_messages
    messages.where('(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.user.id, self.user.id)
    # this hits the database 1 extra time however due to self.user.id
    # you could change it to inbox_messages(user_id) and pass in the id manually
  end
end

first_thread = current_user.threads_in_inbox.first
first_thread.inbox_messages

在您的问题中,您似乎正在覆盖由 rails(message_threads 和消息)生成的关联查询 - 不确定它是否是故意的,但我在上面进行了更改。

另外,我认为您可以删除重复项并执行以下操作:

where('(sender_id = ?) AND (sender_status = 0 OR recipient_status = 0)', self.id)
于 2013-02-12T12:32:16.067 回答