在rails中连接两个表后,基于created_at表进行排序

时间:2015-07-24 23:26:51

标签: sql ruby-on-rails join

我有4个模型:UserMicropostAnswerActivityActivity属于Micropost。我想加入Micropost表格和Activities表格,并根据created_at中的Activities列对结果进行排序,其中user_id中的Activitiesdef feed Micropost.joins(:activities).where('activities.user_id=?',id) .order('activities.created_at DESC') end 当前用户。这是我的方法Feed:

Micropost

但输出仍按created_at row_number() over ( order by a.n) as N 列排序。我改变了订单重新订购;还是一样的结果。我google了很多,逻辑似乎是正确的。有人可以帮忙吗?提前谢谢。

我明白了这个问题。活动模型有两列,其中存储微博ID。一个有micropost_id和其他action_id。它通过action_id加入。我怎么能改变它?

1 个答案:

答案 0 :(得分:0)

您的查询看起来确实正确,因此我假设问题与您在编辑中描述的一样(加入是通过错误的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')

在大多数人想要更复杂的连接的情况下,这是有用的。在你的情况下,我认为你的关系是真正的问题。