Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在给定值内按关联模型排序?_Ruby On Rails_Sorting_Activerecord_Associations - Fatal编程技术网

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查询中的所有项进行“即时加载”,因此性能问题不大。