我正在使用 Rails 4、coffeescript、Google Maps API 和 jquery 创建一个旅行计划应用程序。在我们的旅行计划页面上,我们允许用户在 Google map 上将多个目的地链接在一起,并根据需要将旅行保存到他们的帐户中。
我们正在使用 3 个主要模型:
行程 - 包含行程名称、开始日期和结束日期
目的地 - map 上的位置,由名称和地理坐标(纬度/经度)标识。目的地与旅行没有直接联系。
DestinationOrders - 该表包含行程中目的地的顺序(如链接列表)。这些列是 trip_id、destination_id 和 order_authority。 Order_authority 将是一个数字,我们使用 method described here. 对目的地顺序进行排序。
页面上的一组典型操作是:
- 加载谷歌地图
- 使用 Google 的地点自动填充功能 (javascript) 选择第一个目的地。在 Google map 上添加第一个目的地的标记
- 添加第二个目的地,放置标记,用路径链接两个目的地
- 添加第三个目的地,放置标记,用路径链接目的地 2 和目的地 3
- 用户点击“保存”将行程存储在他的帐户中
我们对 Rails 还很陌生,我想知道考虑到 javascript、 Controller 和模型之间的来回,解决这个问题的最佳方法。在他单击“保存”之前,我们不想将行程关联到他的帐户。
我们想到的可能方法:
我们是否创建模型的新实例,然后当用户单击“保存”时,将所有实例保存到数据库中?这里的问题是在尝试创建 DestinationOrder
时,因为它需要尚未创建的行程 ID 和目的地 ID。使用上面的步骤,这将类似于:
trip = Trip.new
- 通过 Ajax 向 Controller 发送位置信息(地点),然后:
firstDestination = Destination.new(名称:place.name,纬度:place.geometry.location.lat,长:place.geometry.location.long)
firstDestOrder = DestinationOrder.new
另一个可能的(天真的)解决方案是将所有内容存储在 javascript 变量中,直到用户单击“保存”,然后按顺序发送包含所有目标的 ajax 请求并创建模型。
最后,我们想到了随着用户的旅行而创建和保存行程和目的地的可能性。也就是说,当用户第一次访问该页面时,将创建并保存行程。当用户添加目的地时,该目的地也会被保存。这允许我们传递 DestinationOrder
这些 id,如果用户单击“保存”,我们会将 trip_id
与其帐户相关联。但是,如果用户在创建过程中离开网站,这将创建一个没有关联用户的僵尸之旅,并且需要一些过程来经常清理这些内容。
处理这种情况最有效的方法是什么?我希望我的解释是有道理的 - 如果我需要澄清,请告诉我。如有任何帮助,我们将不胜感激!
最佳答案
我认为你的模式有点奇怪。似乎您真正想做的是创建与目的地相关联的行程,并且每个目的地都有订单。您真正需要的是具有许多直通关联,这将使您能够灵活地在联接表上添加顺序属性。
一个行程通过 DestinationOrder 有许多目的地,这样 DestinationOrder 就充当了目的地模型和行程模型之间的粘合剂(连接模型)。看来这就是您想要做的,但您从未完全说出协会的名称,所以我想我应该澄清一下。
http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
现在介绍操作顺序。 当用户创建旅行时,我会保存该旅行。 创建行程后,您就可以开始向其中添加目的地。 是的,您可能会创建没有目的地的旅行,但这使用户能够返回并继续填写旅行。旅行是需要很长时间来计划的事情,所以我认为即使没有任何目的地,也可以创建旅行,然后在创建目的地时添加目的地。
请参阅此引用How to save data with has_many :through
希望对一些人有帮助。
关于javascript - 在保存之前临时创建和关联模型 [Rails、Ajax、Google map ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33581049/