Rails方式用户对话

时间:2012-07-03 14:48:29

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1

我需要使用用户消息(对话框)构建应用程序。 我通过这种方式解决了这个问题:

应用/模型/ conversation.rb

class Conversation < ActiveRecord::Base
  belongs_to :user
  belongs_to :interlocutor
  has_many :messages
end

应用/模型/ message.rb

class Message < ActiveRecord::Base
  belongs_to :conversation
  belongs_to :user
  attr_accessible :message
end

应用/模型/ user.rb

class User < ActiveRecord::Base
  ...
  def conversations
    Conversation.uniq.joins(:messages)
      .where("conversations.user_id = ?", self.id)
      .where("conversations.interlocutor_id = ?", self.id)
      .order("messages.created_at DESC")
  end
end

我对会话方法感到困惑。这就像PHP方式 - 没有灵活性。

可以通过rails方式重写吗?也许它可能是AR关系?

感谢。

2 个答案:

答案 0 :(得分:2)

为什么User的{​​{1}}有很多Conversations?这对我来说最有意义......

class User < ActiveRecord::Base
  ...
  has_many :conversations
end

此外,您已经说过 Conversation belongs_to一个User!你没有完成另一半的关系......

答案 1 :(得分:2)

考虑scoping查询。

在Rails 3中,这看起来像

class Conversation < ActiveRecord::Base
  scope :involving, lambda do |user|
    joins(:messages)
      .where("conversations.user_id = ?", user.id)
      .where("conversations.interlocutor_id = ?", user.id)
      .order("messages.created_at DESC")
  end
end

像这样使用:

Conversation.involving(me).all