我正在使用Rails 5和postgresql 9.6。我有以下模型和关系
表格
关系
人
has_and_belongs_to_many :segments, through: :people_segments
段:
has_and_belongs_to_many :people, through: :people_segments
在这里,我希望得到与特定细分市场无关的人群。我尝试使用join但无法获得结果。现在我使用“不在”查询,花了更多的时间。没有使用“不在”中还有其他方法吗?
答案 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
的对象。
用创造力思考这种关系是什么,people
和segments
与role
或position
...
要实施has_many :through
,您可以按照guide
完成后,您可以使用Position
对象进行查询。
Position.where.not(segment_id: 1)
如果这不是您所需要的,rails query documentation包含更多信息,StackOverflow不能替代官方文档