0

我使用rails 4,coffeescript,Google Maps API和jquery创建旅程规划应用程序。在我们的旅行计划页面上,我们让用户在Google地图上将多个目的地链接在一起,并根据需要保存到他们的帐户。在保存之前临时创建和关联模型[Rails,Ajax,Google Maps]

我们有我们正与3种主要型号有:

旅行 - 包含此行的名称,开始和结束日期

目的地 - 在地图上的位置,通过名称识别和地理坐标(纬度/经度)。目的地不与旅行直接相关。

DestinationOrders - 这是表包含行程中的目的地顺序(如链接列表)。这些列是trip_id,destination_id和order_authority。 Order_authority将是一个数,我们使用排序使用method described here.

一组典型的页面上的操作目标的顺序是:

  1. 负载的谷歌地图
  2. 使用谷歌的地方选择第一个目的地自动完成功能(javascript)。标记添加到谷歌地图的第一个目的地
  3. 添加第二个目的地,放置标志物,具有路径
  4. 链接两个目的地添加第三个目的地,放置标记,链接目的地2和与目标3路径
  5. 用户点击“保存”行程存放在他的账户

我们是相当新的轨道,我想知道的最佳方式来处理这给后面和JavaScript之间来回,控制器,和模型。我们不想将旅程与他的帐户关联,直到他点击保存。

我们想到的可能方法: 我们是否创建模型的新实例,然后当用户单击保存时,将所有实例保存到数据库?这里的问题是当试图创建DestinationOrder时,因为它需要一个trip id和一个尚未创建的目标id。用我们上面的步骤,这将是这样的:

  1. trip = Trip.new
  2. 发送位置信息(地点)通过Ajax控制器,则:

firstDestination = Destination.new (name: place.name, lat: place.geometry.location.lat, long: place.geometry.location.long)

firstDestOrder = DestinationOrder.new

另一种可能的(天真的)解决方案是将所有存储在JavaScript变量中的内容保存到用户点击保存,然后按顺序发送一个包含所有目的地的ajax请求并创建模型。

最后,我们想到随着用户的出现,创建和保存出行和目的地的可能性。也就是说,当用户第一次访问该页面时,就会创建并保存旅程。当用户添加目的地时,该目的地也将被保存。这允许我们通过DestinationOrder这些ID,并且如果用户点击保存,我们会将trip_id与他的账户相关联。但是,如果用户在创建中途离开网站,这将创建一个没有关联用户的僵尸之旅,并且需要一些过程来每隔一段时间清理一次。

处理这种情况的最有效方法是什么?我希望我的解释有意义 - 请告诉我是否需要澄清。任何帮助表示赞赏!

回答

1

我认为你的模式有点奇怪。看起来像你真正想要做的是创建与目的地相关联的旅程,并且每个目的地都有订单。你真正想要的是拥有很多直通关联,这会给你在连接表上添加顺序属性的灵活性。

旅行通过DestinationOrder有很多目的地,这种方式DestinationOrder作为Destination模型和Trip模型之间的粘合(连接模型)。这似乎就是你想要做的,但你从来没有说过这个协会的名字,所以我想我会澄清这一点。

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

我们经营秩序。 当用户创建旅程时,我会保存该旅程。 一旦创建了该行程,您就可以开始为其添加目的地。 是的tou可能会创建没有目的地的旅行,但是可以让用户返回并继续填写行程。旅行是需要很长时间才能计划的,所以我认为即使旅行没有任何目的地也可以创建旅行,然后在创建目的地时添加目的地。

参考见本How to save data with has_many :through

希望帮助一些。

相关问题