ActiveRecord按特定关系的值排序

时间:2015-02-20 02:23:07

标签: mysql sql ruby-on-rails ruby activerecord

class Foo < ActiveRecord::Base
  has_many :bar
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

我想订购我的:foos ...基于它的最后一个:bar

所以,让我们说:

Foo.first.bars => [{key: 'a', value: 1}, {key: 'b', value: 2}, {key: 'c', value: 3}]

所以... Foo.first.bars.last.value => 3

我有一堆:foos,每个都有一堆:吧,但我只关心最后一个:吧。

我可以根据最后一个:value对我的:foos进行排序吗? Bar需要范围吗?

例如......

Foo.includes(:bars).order('bars.last.value')

1 个答案:

答案 0 :(得分:1)

class Foo < ActiveRecord::Base
  has_many :bar
  scope :latest_foo_value, ->(ord) { includes(:foos).order("foos.value #{ord.upcase}") }
end

class Bar < ActiveRecord::Base
  belongs_to :foo
  default_scope order: 'created_at DESC'
end

谢谢,@丹!如果你想复制并粘贴到你自己的答案中,我很乐意给你信任。你知道是否有办法在Bar上调用命名范围?类似的东西:

class Foo < ActiveRecord::Base
  has_many :bar
  scope :latest_foo_value, ->(ord) { includes(:foos).order("foos.current.value #{ord.upcase}") }
end

class Bar < ActiveRecord::Base
  belongs_to :foo
  scope :current, -> { order('created_at DESC') }
end

那不起作用...... Mysql2::Error: Unknown column 'foos.current.value' in 'order clause'

干杯!