0

我正在编写一个应用程序,一年中的每一天每天都需要 3 次输入。(3*365=1095)。我正在努力寻找一种以有效方式输出每个字段的方法。

输入不是全有或全无(您可以填写 10 天的输入,点击保存,稍后再回来填写更多)

我试图通过在控制器中构建所有 1095 个对象然后在视图中输出输入来做到这一点,但显然这真的很慢并且可能是内存密集型的。

有什么建议么?我倾向于在客户端编写整个表单,然后使用 AJAX 填充现有元素。

编辑

该模型称为 Timing,具有以下属性: month, day, time1, time2, time3 因此要保存 365 个模型。

4

3 回答 3

2

听起来你有一个嵌套资源。您有一个名为计时的资源,其中包含一个名为“什么”的资源?

#routes
resources :timing do
  resources :day
end

因此,假设在创建时间时,您也创建了所有 365 天(听起来像是一项非常昂贵的操作)。显示字段并不是那么棘手。你可以做

#controller
def show
  @timings = Timing.all
end

#view
(Date.beginning_of_year..Date.end_of_year).each do |day|
  t = @timings.find { |timing| timing.date == day } #or some other method of deciding that the current day has a timing
  unless t.nil?
    form_for t #etc
  else
    form_for Timing.new #etc
  end
end

然后,也许您可​​以通过 UJS 提交每个文件并收工。虽然这听起来像一个非常复杂的设计,但我不确定你的问题区域是什么。

于 2012-05-16T20:39:03.113 回答
1

如果我正确理解您的问题,您需要一种在表单上动态显示时间输入的方法,每天 3 个。

如果以上是正确的,我建议您按照@DVG 的详细说明执行嵌套资源,并加载当天。如果您需要加载多天,您可以通过 UJS (Ajax) 轻松请求并将其加载到同一页面上。

为了不破坏服务器,您可能想要做的是自动保存时间输入或在分组失去焦点时自动保存每天的时间输入。

于 2012-05-16T20:43:49.523 回答
1

@DVG 的答案可能工作正常,但它保留了服务器上的所有工作。

我最终想到的是我最初的想法:像这样获取所有现有的时间:

def edit
  @timings = Timing.find_by_store_id(params[:store_id])
end

然后在视图中,我编写了两个 javascript 函数:一个写入所有 365 行和所有 3 列。一旦该字段全部在 Javascript 中输出,我使用另一个函数获取现有记录并将它们插入到表单中:

<script type="text/javascript">
function updateForm(){
 timings = <%= @timings.to_json %>;
 ... fill out the fields ...
}
</script>

It works nice and fast, and best of all, no AJAX calls. Of course one caveat is that this fails if the user has Javascript disabled, but that's not an issue for me.

于 2012-05-22T01:04:36.217 回答