在连接表属性上对has_many进行排序

时间:2013-12-02 21:16:21

标签: ruby-on-rails activerecord ruby-on-rails-4 associations has-many-through

假设我在rails4 app中有以下内容:

class Foo < AR::Base
  has_many :foo_bar
  has_many :bar, through: :foo_bar
end

foo_bar表有一个带有数字的“sort”列。为了使事情更有趣,“酒吧”表还有一个带有数字的“排序”列。与连接表排序列的名称相同。而且,这很重要......

class Bar < AR::Base
  default_scope -> { order(:sort) }
end

我需要在关联上有一个默认范围,例如:

foo = Foo.last
foo.bars # => List of bars, ordered by the number on the foo_bar table

我该怎么做?这意味着取消了该栏,但只是排序

3 个答案:

答案 0 :(得分:2)

您可以使用order选项

指定集合的​​排序顺序
class Foo < AR::Base
  has_many :foo_bar
  has_many :bar, -> { order('foo_bar.sort') }, through: :foo_bar
end

答案 1 :(得分:0)

你可以这样做:

foo.bars.sort(foo_bar.position)

sort将按给定属性对列表进行排序,因此请在foo_bar上为其指定要排序的属性。

答案 2 :(得分:0)

我这样做是为了工作:

class Foo < AR::Base
  has_many :foo_bar
  has_many :bar, through: :foo_bar

  def sorted_bars
    foo_bar.map(&:bar)
  end
end

由于默认范围,这对我来说太复杂了。我仍然会接受一个提供更优雅解决方案的答案:)