带连接表的Rails HABTM获取非关联记录

时间:2017-11-02 08:25:30

标签: sql ruby-on-rails has-and-belongs-to-many

我正在使用Rails 5和postgresql 9.6。我有以下模型和关系

表格

  1. people_segments(加入表格)
  2.   

    关系

    has_and_belongs_to_many :segments, through: :people_segments 
    

    段:

    has_and_belongs_to_many :people, through: :people_segments 
    

    在这里,我希望得到与特定细分市场无关的人群。我尝试使用join但无法获得结果。现在我使用“不在”查询,花了更多的时间。没有使用“不在”中还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

你的对象错了

模型为person,表格为people

Model Person.rb

has_and_belongs_to_many :segments

Model Segment.rb

has_and_belongs_to_many :people

迁移看起来像这样

class CreatePeopleAndSegments < ActiveRecord::Migration[5.0]
  def change
    create_table :people do |t|
      t.string :name
      t.timestamps
    end

    create_table :segments do |t|
      t.string :part_number
      t.timestamps
    end

    create_table :people_segments, id: false do |t|
      t.belongs_to :person, index: true
      t.belongs_to :segment, index: true
    end
  end
end

因此,当您执行@person.segments时,您会获得包含所有细分的数组反之 @segment.people

  

在这里,我希望得到与特定细分市场无关的人群。我尝试使用join但无法获得结果。现在我使用“不在”查询,花了更多的时间。没有使用“不在”中还有其他方法吗?

在两个表之间已经存在Join,也许您最好的选择是确保您可以在应用程序端使用该连接作为Model

在rails的 association_basics 指南中有一个特定的章节讨论这个,它被称为choosing-between-has-many-through-and-has-and-belongs-to-many

我引用他们

  

最简单的经验法则是如果您需要将关系模型作为独立实体,则应设置has_many:through关系。如果您不需要对关系模型执行任何操作,则设置has_and_belongs_to_many关系可能更简单(尽管您需要记住在数据库中创建连接表)。

我相信,如果你阅读那一章,你就会明白最好的选择是使用has_many :through并在你的应用程序中有一个代表表people_segments的对象。

用创造力思考这种关系是什么,peoplesegmentsroleposition ...

之间存在这种关系

要实施has_many :through,您可以按照guide

进行操作

完成后,您可以使用Position对象进行查询。

Position.where.not(segment_id: 1)

如果这不是您所需要的,rails query documentation包含更多信息,StackOverflow不能替代官方文档