我有4个模型:User
,Micropost
,Answer
和Activity
。 Activity
属于Micropost
。我想加入Micropost
表格和Activities
表格,并根据created_at
中的Activities
列对结果进行排序,其中user_id
中的Activities
是def 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加入。我怎么能改变它?
答案 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')
在大多数人想要更复杂的连接的情况下,这是有用的。在你的情况下,我认为你的关系是真正的问题。