【问题标题】:Sorting based on created_at table after joins two table in rails在rails中连接两个表后基于created_at表排序
【发布时间】:2015-07-24 23:26:50
【问题描述】:

我有 4 个模型:UserMicropostAnswerActivityActivity 属于 Micropost。我想加入Micropost 表和Activities 表并根据Activities 中的created_at 列对结果进行排序,其中Activities 中的user_id 是当前用户。这是我的方法提要:

def feed
  Micropost.joins(:activities).where('activities.user_id=?',id)
  .order('activities.created_at DESC')
end

但输出仍然按Micropostcreated_at 列排序。我将订单更改为重新排序;还是一样的结果。我google了很多,逻辑似乎是正确的。有人可以帮忙吗?提前致谢。

我理解问题所在。活动模型有两列存储微博 ID。一个带有 micropost_id 和其他 action_id。它通过action_id 加入。我该如何改变呢?

【问题讨论】:

    标签: sql ruby-on-rails join


    【解决方案1】:

    您的查询看起来确实正确,所以我假设问题与您在编辑中描述的一样(连接是通过错误的 ID 发生的)。 Rails 根据您设置的关系决定如何连接两个表,因此如果连接不是您所期望的,那么您需要确保您的关系是正确的。在你的情况下,你会想要这样的东西:

    class Micropost < ActiveRecord::Base
      has_many :activities
      has_many :action_activities, class_name: 'Activity', foreign_key: :action_id
    end
    
    class Activity < ActiveRecord::Base
      belongs_to :micropost
      belongs_to :action, class_name: 'Micropost'
    end
    

    由于 Micropost 以两种不同的方式与 Activity 相关,因此需要明确告知。我使用了foreign_key 选项来确保它知道哪个是哪个。使用该代码,您可以看到这会生成预期的 SQL:

    irb> Micropost.joins(:action_activities)
      Micropost Load (2.8ms)  SELECT "microposts".* FROM "microposts" INNER JOIN "activities" ON "activities"."action_id" = "microposts"."id"
    

    另一个选项是在您的加入中明确,如下所示:

    Micropost.joins("JOIN activities ON activities.action_id = microposts.id")
      .where('activities.user_id=?',id)
      .order('activities.created_at DESC')
    

    这在您想要更复杂的连接的情况下很有用,主要是。就你而言,我认为你的关系才是真正的问题。

    【讨论】:

    猜你喜欢
    • 2021-01-09
    • 2023-03-10
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2017-07-19
    • 2011-09-03
    相关资源
    最近更新 更多