2

我试图创建地址和旅程之间的关系,我不确定如何建立关系。Has_many通过Rails同时分配不同的角色

每次旅行将有两个地址:起始地址和结束地址。 地址可用于许多不同的旅程,并且它们可以是起始地址或结束地址,具体取决于行程。 我的设想是,当用户创建新旅程时,他们可以从他们所有地址的下拉列表中进行选择,以便他们可以从他们称为“家”的地址到他们称为“机场”的地址“。

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

感谢您的任何建议!

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

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>,因为在旅行的模型中并没有说has_many :trip_locations。通过只使用常规has_many :trip_locations 我已经能够输入所有必要的信息到联接表中,只需使用表单助手fields_for :trip_locations并说一个行程has_many :trip_locations,但然后我没有方法来查询并找到哪个地址具有布尔值连接表设置为true,哪个设置为false。如果我能解决这个问题,我想我会一切都安排好。

回答

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,我相信它应该在设置目标标志时做正确的事情。尝试一下。

+0

我添加了这些东西,然后我尝试将这些行添加到表单中以创建旅程,并指定了原点和目的地。这里是我得到的错误:'无法找到模型TripLocation中的源关联:目的地或目的地。尝试'has_many:destination,:through =>:origin_trip_location,:source =>'。它是:address还是:trip?'我不确定如何继续。 – keb

+0

对不起,我刚刚编辑了最后2个has_one行。因为我们正在处理“通过”关联,所以不应该使用'class_name:'Trip'',而应该是'source::trip'。 –

+0

谢谢你,我已经做出了改变。我现在正尝试将这些字段添加到旅行表格中,我为原始地点和目的地分配地址。我应该从地址(它的ID)传递什么值,以及它应该输入什么? (我尝试使用':origin'或':origin_trip_location',但都出错。)如果您认为这些问题离原始帖子太远,或者说明我已经解决了我原来的问题,请告诉我,我会为此提出一个新问题。 – keb

相关问题