在分配不同角色时,通过Rails进行操作

时间:2013-11-01 23:55:40

标签: ruby-on-rails ruby-on-rails-4 polymorphic-associations

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

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

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

感谢您的任何建议!

编辑: 我已经通过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输入所需的所有必要信息并说出一个旅行has_many :trip_locations,但是我没有方法可以查询并找到哪个地址有连接表中的boolean设置为true,将其设置为false。如果我能解决这个问题,我认为我会全力以赴。

1 个答案:

答案 0 :(得分:1)

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

所以我们假设迁移看起来像这样:

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,我相信它应该通过设置目标标志来做正确的事情。试试吧。