2

我正在尝试在地址和旅行之间建立关系,但我不确定如何建立这种关系。

每个行程将有两个地址:起始地址和结束地址。地址可以在许多不同的行程中使用,它们可以是起始地址或结束地址,具体取决于行程。我的设想是,当用户创建新行程时,他们可以从所有地址的下拉列表中进行选择,这样他们就可以从他们的地址(例如“家”)到他们的地址(例如“机场”)进行旅行。 "

在地址(作为可定位的)与应用程序中的一些其他模型之间已经建立了多态关系,但在这种情况下,同一个地址需要属于两个不同的模型(用户和旅行)。多态连接表会是一个好的解决方案吗?即使这确实解决了问题,一旦您将两个不同的地址连接到行程,区分起始地址和结束地址的最佳方法是什么?

感谢您的任何建议!

编辑:我已经通过 hakunin 实现了下面的所有内容,但我仍然找不到实现功能功能的方法。我决定使用为每个fields_for构建TripLocation对象Trip,但我无法弄清楚在控制器中放入什么。当我放:

def new
  @trip = Trip.new
  @trip.origin_trip_location.build
  @trip.destination_trip_location.build
end

我得到错误undefined method build for nil:NilClass。我本来想@trip.trip_location.build改用,但后来我得到了错误undefined method trip_locations for #<Trip:0x007f5a847f94b0>,因为在 Trip 的模型中没有说has_many :trip_locations. 通过仅使用常规has_many :trip_locations ,我已经能够将所有必要的信息输入到连接表中,只需使用表单帮助器fields_for :trip_locations并说 Trip has_many :trip_locations,但是我没有方法查询和查找连接表集中哪个地址具有布尔值为真,哪个设置为假。如果我能解决这个问题,我想我就准备好了。

4

1 回答 1

1

在 Rails 中,这通常是在关联的条件下完成的。您可以将它与“has_one through”结合使用。创建一个新模型,我们称之为TripLocation旅行和地址之间的映射表。在其中您将有列,说“目的地”。如果该列为真,则此映射用于目标地址。

因此,假设迁移如下所示:

create_table :trip_locations do |t|
  t.belongs_to :trip
  t.belongs_to :address
  t.boolean :destination
end

这些将是模型:

class TripLocation < ActiveRecord::Base
  belongs_to :trip
  belongs_to :address
end

class Trip < ActiveRecord::Base    
  has_one :origin_trip_location,
    class_name: 'TripLocation',
    conditions: { destination: nil }

  has_one :destination_trip_location,
    class_name: 'TripLocation',
    conditions: { destination: true }

  has_one :origin, through: origin_trip_location, source: :trip
  has_one :destination, through: destination_trip_location, source: :trip
end

因此,由于“通过”关联设置的条件,呼叫@trip.origin应该@trip.destination给你正确的地址。

在将地址指定为起点或终点时,您可以简单地将地址分配给您需要的任何地址。@trip.origin = Address.first, 或@trip.destination = Address.second, 我相信它应该通过设置目标标志来做正确的事情。尝试一下。

于 2013-11-02T00:11:51.087 回答