【发布时间】:2015-09-07 03:32:51
【问题描述】:
我有一个模特Place。
例如,地点可以是城市、地区、地区或国家,但我认为一个模型就足够了,因为就我的目的而言,城市和地区之间没有太大区别。
而且地点可以相互归属,例如一个地区可以有很多城市,一个国家可以有很多地区等等。
但我的问题是,这是一个历史项目,一个城市可以属于许多地区。例如,从 1800 年到 1900 年,一座城市属于一个历史区域(现在不存在),而从 1900 年到现在,属于另一个历史区域。重要的是,将这些地区存储为不同的地方,尽管它们可以具有相似的地理边界,但只有名称不同。
我猜是多对多,但也许有人可以给出更好的主意?
如果它是多对多的,我怎样才能在一个查询中获取一系列父位置以生成简单的字符串,例如“位置,父位置 1,父位置 2,父位置 3”,例如“美国加利福尼亚州旧金山”?
这是我的代码:
create_table :places do |t|
t.string :name
t.timestamps null: false
end
create_table :place_relations, id: false do |t|
t.integer :sub_place_id
t.integer :parent_place_id
t.timestamps null: false
end
class Place < ActiveRecord::Base
has_and_belongs_to_many :parent_places,
class_name: "Place",
join_table: "place_relations",
association_foreign_key: "parent_place_id"
has_and_belongs_to_many :sub_places,
class_name: "Place",
join_table: "place_relations",
association_foreign_key: 'sub_place_id'
end
请不要犹豫,给我一些想法!
【问题讨论】:
-
这是一个相当复杂的关系。我对 Rails 还是很陌生,但似乎您在每个时间段内为每个地方/区域都有一个 Place 模型。具有诸如 contains_region_id 之类的属性,它可以告诉您 Place 是什么的一部分,而 previous_region_id 可以告诉您该 Place 是什么或其中的一部分。不过,我不确定拥有/属于关系将如何运作。
-
@AaronWashburn,不完全是......例如,某个地方(城市)可能以前是 5 或 10 个不同国家的一部分......而现在有些国家甚至可能不存在。所以我无法创建一个字段
previous_region_id。还是我误会了你? -
明白了。看起来下面 Paul Richter 的关系表是要走的路。
标签: ruby-on-rails activerecord has-and-belongs-to-many