ActiveRecord:地点和路线有哪些关联?
ActiveRecord : which associations for places and routes?
我想关联路线中的地点:一条路线有两个地点(起点和终点)+ 我需要存储这两个点之间的距离。我想知道数据模型是否正确:
https://github.com/roms182/frais-kilometriques/blob/master/Annexes/shortmodel.png
而且我不确定如何解决 Rails 中的关联。
class Place < ApplicationRecord
has_many :routes
end
class Route < ApplicationRecord
belongs_to :place
end
您的路线需要与两个地点相关联 -- 起点和终点。
所以一个选项是:
class Place < ApplicationRecord
has_many :routes_as_start, class_name: "Route", foreign_key: :start_place_id
has_many :routes_as_end, class_name: "Route", foreign_key: :end_place_id
end
class Route < ApplicationRecord
belongs_to :start_place, class_name: "Place"
belongs_to :end_place, class_name: "Place"
end
但是,如果您的路线没有起点和终点的正式概念——即它们只是连接两个地方——您可能会受益于中间模型:
class Place < ApplicationRecord
has_many :route_ends,
has_many :routes, through: :ends
end
class RouteEnd
belongs_to :place
belongs_to :route
end
class Route < ApplicationRecord
has_many :route_ends
has_many :places, :through :route_end
end
在这种情况下,:has_many
实际上应该解释为 :has_two
。
这使您可以更轻松地找到在特定地点终止的所有路线,而无需考虑它们是 "start" 或 "end"。
我想关联路线中的地点:一条路线有两个地点(起点和终点)+ 我需要存储这两个点之间的距离。我想知道数据模型是否正确: https://github.com/roms182/frais-kilometriques/blob/master/Annexes/shortmodel.png
而且我不确定如何解决 Rails 中的关联。
class Place < ApplicationRecord
has_many :routes
end
class Route < ApplicationRecord
belongs_to :place
end
您的路线需要与两个地点相关联 -- 起点和终点。
所以一个选项是:
class Place < ApplicationRecord
has_many :routes_as_start, class_name: "Route", foreign_key: :start_place_id
has_many :routes_as_end, class_name: "Route", foreign_key: :end_place_id
end
class Route < ApplicationRecord
belongs_to :start_place, class_name: "Place"
belongs_to :end_place, class_name: "Place"
end
但是,如果您的路线没有起点和终点的正式概念——即它们只是连接两个地方——您可能会受益于中间模型:
class Place < ApplicationRecord
has_many :route_ends,
has_many :routes, through: :ends
end
class RouteEnd
belongs_to :place
belongs_to :route
end
class Route < ApplicationRecord
has_many :route_ends
has_many :places, :through :route_end
end
在这种情况下,:has_many
实际上应该解释为 :has_two
。
这使您可以更轻松地找到在特定地点终止的所有路线,而无需考虑它们是 "start" 或 "end"。