当我必须对对象列表进行排序时,我认为 attr_accessor 具有与另一个相同的行为,但似乎有所不同:
dataRecords = MyData.where("day = ?", Time.now.yesterday.strftime("%Y%m%d").to_i)
dataRecords.each do |data|
data.accessor_var = func(data.x, data.y)
end
@sortedData = dataRecords.order('accessor_var DESC')
但@sortedData 没有被排序...
您需要记住,当您将范围或订单应用于ActiveRecord::Relation
数据从表中重新加载。这意味着当您循环它们并更改属性时,除非保存结果,否则更改将无法用于下一个作用域调用。
您可以使用sort_by
相反,它将适用于内存中的对象而不是数据库。
选项 1:循环时保存(对于访问器可能没有多大用处!)
dataRecords = MyData.where("day = ?", Time.now.yesterday.strftime("%Y%m%d").to_i)
dataRecords.each do |data|
data.accessor_var = func(data.x, data.y)
data.save
end
@sortedData = dataRecords.order('accessor_var DESC') # Reload from table will include the saved values.
选项 2:排序依据
dataRecords = MyData.where("day = ?", Time.now.yesterday.strftime("%Y%m%d").to_i)
dataRecords.each do |data|
data.accessor_var = func(data.x, data.y)
end
@sortedData = dataRecords.sort_by{|data| data.accessor_var}
Also, toro2k https://stackoverflow.com/a/17315705/385532一旦您了解情况,就会对您的排序进行一些很好的优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)