class Advert < ActiveRecord::Base
has_many :advertised_vehicles, -> { order(price: :asc) }
end
v1 = AdvertisedVehicle.create(price: 2000)
v2 = AdvertisedVehicle.create(price: 1000)
a = Advert.create(advertised_vehicles: [v1, v2])
a.advertised_vehicles.map(&:price)
# => [2000, 1000] - fails
a.advertised_vehicles.order(price: :asc).map(&:price)
# => [1000, 2000] - works
为了让这个工作起作用,我不得不求助于advertised_vehicles
:
class Advert < ActiveRecord::Base
has_many :advertised_vehicles
def advertised_vehicles
super.order(price: :asc)
end
end
class Advert < ActiveRecord::Base
has_many :advertised_vehicles, -> { throw order(price: :asc) }
end
throw
时,将再次返回无序关系如何获得关系的默认排序语法?
答案 0 :(得分:1)
这些值不是从数据库中排序的,而是从您将它们传递给create
:[v1, v2]
的方式排序的。在创建关联被视为已加载后,当您调用它时,无需从数据库重新加载它(具有正确的顺序子句)。
要对它们进行排序,您可以:
a.reload
)a.advertised_vehicles(true).map(&:price)
)当然,第一个效率最高,但您需要使用默认的关系范围保持排序代码最新。所以你必须决定什么对你更重要。