【问题标题】:Temporarily creating and associating models before save [Rails, Ajax, Google Maps]保存前临时创建和关联模型 [Rails, Ajax, Google Maps]
【发布时间】:2015-11-07 09:08:08
【问题描述】:

我正在使用 rails 4、coffeescript、Google Maps API 和 jquery 创建一个旅行计划器应用程序。在我们的旅行计划页面上,我们允许用户在 Google 地图上将多个目的地链接在一起,并根据需要将旅行保存到他们的帐户中。

我们正在使用 3 个主要模型:

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

目的地 - 地图上的位置,由名称和地理坐标(纬度/经度)标识。目的地与旅行没有直接关联。

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

页面上的一组典型操作是:

  1. 加载谷歌地图
  2. 使用 Google 的地点自动完成功能 (javascript) 选择第一个目的地。为第一个目的地在 Google 地图中添加标记
  3. 添加第二个目的地,放置标记,用路径链接两个目的地
  4. 添加第三个目的地,放置标记,用路径链接目的地 2 和目的地 3
  5. 用户点击“保存”将行程存储在他的帐户中

我们对 Rails 还很陌生,考虑到 javascript、控制器和模型之间的来回切换,我想知道解决这个问题的最佳方法。在他单击保存之前,我们不想将旅行与他的帐户相关联。

我们想到的可能方法: 我们是否创建了模型的新实例,然后当用户单击保存时,将所有实例保存到数据库中?这里的问题是在尝试创建DestinationOrder 时,因为它需要尚未创建的行程 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 与他的帐户相关联。但是,如果用户在创建过程中离开了站点,这将创建一个没有关联用户的僵尸之旅,并且需要一些过程来经常清理这些。

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

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby-on-rails-4 google-maps-api-3


    【解决方案1】:

    我认为您的架构有点奇怪。似乎您真正想要做的是创建与目的地相关联的旅行,并且这些目的地中的每一个都具有和顺序。您真正要寻找的是具有多个直通关联,这将使您可以灵活地在连接表上添加 order 属性。

    一个旅行通过 DestinationOrder 有许多目的地,这样 DestinationOrder 充当目的地模型和旅行模型之间的粘合剂(连接模型)。看起来这就是你想要做的,但你从来没有完全说出协会的名称,所以我想我会澄清一下。

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

    现在是操作顺序。 当用户创建行程时,我会保存该行程。 创建该行程后,您可以开始向其中添加目的地。 Yes tou 可能会创建没有目的地的旅行,但这使用户能够返回并继续填写旅行。旅行是需要很长时间来计划的事情,所以我认为即使它没有任何目的地,也可以创建旅行,然后在创建目的地时添加目的地。

    参考How to save data with has_many :through

    希望对一些人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多