如何在给定值内按关联模型排序?

时间:2011-06-30 12:28:50

标签: ruby-on-rails sorting activerecord associations

我有模型项目和模型统计数据。

 Item
   has_many :stats

 Stat
   belongs_to :items

在模型(例如mysql表)Stat中有3个字段: 评分 skin_id ITEM_ID

因此,对于Stat,它可能是,如:

@item.stats => Array of stats for records with item_id = 1, with a differer skin_id

我需要按照“评级”为给定的skin_id排序所有项目。

类似的东西:

@items = Item.all.order('stats[currtnt_skin.id] DESC') (of course it doesn't work)

换句话说,我需要在数组中进行排序:

@stats = @items.stats[current_skin.id]
@items.order (... by @stats ...)

怎么做?

4 个答案:

答案 0 :(得分:5)

首先,我假设belongs_to :items你的意思是belongs_to :item(单数),因为存在item_id外键。

其次,要解决您的特定查询,您可以使用:

Stat.where(:skin_id => skin_id).joins(:item).order("items.rating DESC")

但是,如果skin_id引用另一个模型 - 即Stat belongs_to :skinSkin has_many :stats,那么从那里开始可能更有意义:

skin = Skin.find(1)
stats = skin.stats.order("rating DESC").includes(:item)

要获取项目,然后循环浏览它们:

stats = skin.stats.order("rating DESC").includes(:item)

stats.each do |stat|
   stat.item
end

˚F

答案 1 :(得分:1)

@items = Item.join(:stats).order('skin_id DESC')

我相信,虽然我可能会错误地认为加入表格会对您定义的关联有所帮助。

答案 2 :(得分:0)

在rails 3中它将是:

Item.includes(“stats”)。order(“stats.skin_id desc”)

答案 3 :(得分:0)

你试过这个吗?

Item.includes("stats").where('stats.skin_id = ?', 1).order("stats.rating desc")