RoR:在子表上按条件选择连接模型

时间:2014-09-15 23:10:10

标签: ruby-on-rails activerecord

我有以下架构:

foo:
  id: integer

bar:
  id: integer
  condition: boolean

foo_bar:
  id: integer
  foo_id: integer
  bar_id: integer

模型和架构都是这样的。给定foo的一个实例,我想得到一个foo_bar的实例,其中相应的bar.condition为true。

是否有一种对RoR友好的方法呢?

2 个答案:

答案 0 :(得分:1)

首先,您需要设置一些ActiveRecord关联:

class Foo < ActiveRecord::Base
  has_many :foo_bars
end

class Bar < ActiveRecord::Base
  has_many :foo_bars
end

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

然后您可以查询这些关联。给定一个Foo实例,找到FooBar的第一个实例,其中bar.name ==&#39; my-bar&#39;:

foo = Foo.find(1)
foo.foo_bars.include(:bar).where(bar: {name: 'my-bar'}).first

答案 1 :(得分:0)

您可能希望考虑ActiveRecord Association Extensions

#app/models/foo.rb
class Foo < ActiveRecord::Base
   has_many :foo_bar
   has_many :bar, through: :foo_bar do
      def true
         where condition: true
      end
   end
end

#app/models/foo_bar.rb
class FooBar < ActiveRecord::Base
   belongs_to :foo
   belongs_to :bar
end

#app/models/bar.rb
class Bar < ActiveRecord::Base
   has_many :foo_bar
   has_many :foo, through: :foo_bar
end

这将使您能够调用以下内容:

@foo = Foo.find x
@foo.bar.true

虽然这不会自己调用foo_bar条记录,但如果您正确使用它,能够加载您需要的数据