Rails 4 has_many虽然在哪里过滤

时间:2016-02-08 22:56:25

标签: ruby-on-rails

我试图弄清楚是否可以按记录分组/过滤/选择'属性虽然是连接表。虽然我理解还有其他方法可以实现相同的结果(我在下面使用其中一种),但我想知道是否可以通过HMT关系实现相同的效果。

模型如下:

class Foo < ActiveRecord::Base
  has_many :foo_bars
  has_many :bars, through: foo_bars

  # SOMETHING LIKE THIS:
  has_many :group_a_bars, -> where { foo_bars.bar.bar_group_id: 1 }
end

class Bar < ActiveRecord::Base
  # == Schema Information
  #
  # Table name: bars
  # bar_group_id :integer          not null

  belongs_to :bar_group
end

class FooBar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end

class BarGroup < ActiveRecord::Base
  has_many :bars
end

我希望在视图中能够执行的操作类似于:#{foo.group_a_bars}所有FooBars bars属于第一个bar_group foo.foo_bars.find_all{ |foo_bar| foo_bar.bar.bar_group_id == 1 } }

同样可以通过以下方式实现:

class Foo < ActiveRecord::Base
  has_many :foo_bars
  has_many :bars, through: foo_bars

  # WORKING:
  has_many    :group_a_bars,
                ->              { joins(:bar).where(bars: { bar_group_id: 1 }) },
                class_name:     "FooBar",
                source:         :bar
end

编辑:根据@smathy的建议,我添加了一个加入,并使用以下内容:

{{1}}

1 个答案:

答案 0 :(得分:1)

是的,它会是这样的:

has_many :group_a_bars,
  -> { joins(:bar).where( bar: { bar_group_id: 1 } ) }, through: :foo_bars, class_name: "Bar"

您可能还需要:source选项。