Ruby on rails 如何在给定值内按关联模型排序?
我有模型物品和模型统计Ruby on rails 如何在给定值内按关联模型排序?,ruby-on-rails,sorting,activerecord,associations,Ruby On Rails,Sorting,Activerecord,Associations,我有模型物品和模型统计 Item has_many :stats Stat belongs_to :items 在模型(例如mysql表)Stat中有3个字段: 评级 皮肤id 项目编号 对于Stat来说,它可能是: @item.stats => Array of stats for records with item_id = 1, with a differer skin_id 我需要根据“评级”对给定皮肤id的所有项目进行排序 比如: @items = Item
Item
has_many :stats
Stat
belongs_to :items
在模型(例如mysql表)Stat中有3个字段:
评级
皮肤id
项目编号
对于Stat来说,它可能是:
@item.stats => Array of stats for records with item_id = 1, with a differer skin_id
我需要根据“评级”对给定皮肤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 ...)
如何做到这一点?在rails 3中,它将类似于:
@items = Item.all.order('stats[currtnt_skin.id] DESC') (of course it doesn't work)
Item.includes(“stats”).order(“stats.skin\u id desc”)@items=Item.join(:stats).order(“skin\u id desc”)
我相信,尽管我可能错了,加入表格会对您定义的关联产生影响。您尝试过这个吗
Item.includes("stats").where('stats.skin_id = ?', 1).order("stats.rating desc")
首先,我假设
属于:items
你的意思是属于:item
(单数),因为item\u id
外键的存在
其次,要解决您的特定查询,您可以使用:
Stat.where(:skin_id => skin_id).joins(:item).order("items.rating DESC")
但是,如果skin\u id
引用了另一个模型,即Stat属于:skin
并且skin有许多: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否,因为stats.skin\u id将返回一个物品的统计数据数组,因为我有许多单个物品的统计数据。我必须提供skin_id,仅根据提供的skin_id进行排序,我不打算在这上面下太多赌注,但我有理由相信您需要使用include而不是join,至少在最近的rails版本中是这样。Joins进行延迟加载,因此我认为这实际上不起作用。你可能是对的……我的印象是,只包含相关联的对象,但不一定在一个查询中完成。当然,我可能弄错了。犯错是我最好的技能之一。是的,但这是不对的。是的,我正在选择所有提供皮肤id的物品,但它们是按我的所有统计等级排序的。应该有类似Item.includes(“stats”).where('stats.skin_id=?',1).order(“stats.rating[skin_id]desc”)的东西。我想我感到困惑的地方是stats.rating[skin_id]不是我熟悉的sql语法。很明显,从我下面的错误回答中,我不能完全理解你的问题……对不起:(我也不能理解这个问题。很明显,这是一个非常简单的问题,但条件不清楚。当然顺序(“stats.rating[skin_id]desc”)这只是一个示例,但不是SQL语法。我试图说明我不需要所有stats.rating数组,但是,例如,它是第一个值。例如:array_of_stats[0]可以将一些记录(项、统计)粘贴到某个位置吗以及所需的输出?这个问题对我来说不是很清楚。是否可以从“项目侧”而不是从统计数据进行设置?因为在这种情况下,我有一个统计数据数组,但没有项目。要获取项目,只需使用.Item方法-我已经更新了示例。通过使用includes(:Item)方法时,Rails对一个SQL查询中的所有项进行“即时加载”,因此性能问题不大。