【问题标题】:How to I modify the order of data from one model using the data of another model in ruby on rails?如何在 ruby​​ on rails 中使用另一个模型的数据修改一个模型的数据顺序?
【发布时间】:2013-02-05 19:13:22
【问题描述】:

我有一个页面上显示的对话列表。这些对话中的每一个都充满了 2 个用户之间的消息。

一个会话 has_one 消息(作为该会话其他消息的父消息的主消息)。对话列表目前的排序如下:

default_scope :order => 'conversations.updated_at DESC'

我希望使用最近发布的消息 created_at 或 updated_at 时间/日期对列表进行排序。要获取最近发布的消息,我可以这样做

c = Conversation.find(4)
c.message.children.last

然后我可以从那里访问我想要的列。以下是我目前拥有的。有没有办法对此进行调整,以便它访问我的 Messages 表并从刚刚发布的消息中获取 created_at 和 updated_at 数据,并使用这些数据对上述对话列表进行排序?

class Conversation < ActiveRecord::Base

   belongs_to :message

   default_scope :order => 'conversations.updated_at DESC'



class Message < ActiveRecord::Base

  acts_as_tree
  has_one :conversation

亲切的问候

【问题讨论】:

  • 你能添加你的模型和关联定义吗?我认为我们缺少基于“c.message.children ...”和“message_threads.updated at ...”的东西我认为您需要的解决方案并不困难,我只是想确保您获得正确的信息。
  • 嗨,对不起,message_threads 应该说对话。我已经更正了。
  • 没问题。为了清楚起见——这种设置方式将对话与消息的关系显示为一对一。一个对话与一条消息相关联,而一条消息只有一个对话。这是正确的吗?
  • 是的,这是正确的。每条消息都有组成对话的孩子。第一条消息是用于识别对话的消息。它有一个 parent_id,即会话表/模型中的 message_id。
  • 好吧,当我说“我认为解决方案不会很困难”时我错了,因为这些关联实际上使得它与理论上可以运行的自引用消息关联一起变得相当困难- 层次深。我同意博尔德在他的答案和 cmets 中所述的方向——但这需要更新架构。很抱歉让你失望了。

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems ruby-on-rails-3.2


【解决方案1】:

为了做你想做的事,你需要加入消息表,按对话 ID 分组,并按 updated_at 的聚合函数排序。 翻译成 Rails,类似于:

default_scope { select("conversations.*, max(messages.updated_at) as last_update").join(:messages).group("conversations.id").order("last_update desc") }

我假设是 Rails 3,尽管您对 default_scope 的第一个定义似乎表明 Rails 2。如果是这样,您必须相应地修改我的代码。

【讨论】:

  • @LondonGuy。我没有足够的声誉来评论您的帖子;但我发现不一致。你说对话有很多消息,但你的代码说 Conversation belongs_to :message。我认为您无法在纯 sql 中使用该配置构建您想要的查询。
  • 我应该说一个对话 has_one 消息(主消息)并且该主消息是该对话的所有其他消息的父级。
  • 你能改变什么吗?我会在每条消息中为对话添加一个外键。如果您想要父消息,您可以使用 where(:parent_id => nil) 轻松完成。这样我的解决方案就适用了。否则我怕纯 sql 不会切。
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多