pth*_*amm 4 ruby activerecord join ruby-on-rails rails-activerecord
我有两个模式:User和Message由一个连接has_many关系.我想得到一个users按其最后一条消息的时间戳排序的列表.
class User < ActiveRecord::Base
has_many :messages
end
class Message < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
当我这样做:
@users = User.includes(:messages).order('messages.created_at DESC').limit(5)
Run Code Online (Sandbox Code Playgroud)
它似乎订购消息,获取最新的5条消息,然后返回与这些消息相关联的用户.所以用户数量可以少于5.我想确保我得到5个用户.
我希望查询得到的最新消息,对于每个请求,下令最后的消息,然后用最新的消息回报用户.所以我想要这样的东西:
@users = User.includes(:messages).order( <messages.last.created_at DESC> )
Run Code Online (Sandbox Code Playgroud)
理想情况下,解决方案将对数据库进行排序,因为我想使用paginate.如果它是相关的我正在使用Postgres.
小智 6
我很可能是优先于由所述的溶液phoet添加到用户的属性如last_message_posted_at和使用touch: true,以更新在消息创建.这简化了在需要提取用户列表时必须执行的查询.这也为您的应用程序提供了更易读的(IMO)链:
@users = User.all.order(:last_message_posted_at)
=> "SELECT \"users\".* FROM \"users\" ORDER BY \"users\".\"last_message_posted_at\" ASC"
Run Code Online (Sandbox Code Playgroud)
这也允许您为User模型添加一个漂亮而简单的范围
scope: :by_recent_message, ->{ order(:last_message_posted_at) }
User.by_recent_message.limit(5)
Run Code Online (Sandbox Code Playgroud)
它还取决于@users使用此范围的时间和频率.对于我来说,在每次拉出用户列表时,比在复杂的SQL查询中添加几毫秒到消息发布时间更好.
- 编辑那些不熟悉触摸语法的人 -
触摸文档:http://apidock.com/rails/v4.2.1/ActiveRecord/Persistence/touch
class User < ActiveRecord::Base
has_many :messages
end
class Message < ActiveRecord::Base
belongs_to :user, touch: true
end
Run Code Online (Sandbox Code Playgroud)
然后进行查询(给最近最后一条消息的用户):
@user = User.includes(:messages).order(updated_at: :desc )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |