0

我有一个名为 foo 的模型,带有一个日期字段。

在我的索引视图中,我显示了指定周的典型“周视图”。为了将数据放在我的视图中,我循环遍历指定一周中的每一天,并在某一天查询数据。我这样做是为了确保在正确的日期输入 NIL。

foos_controller.rb

for day in 0..6
    foo = Foo.this_date(@date+day.days).first
    @foos[day] = foo
end

index.html.haml

- for day in 0..6
    %li
        - if @foos[day].nil?
            Create a new foo?
        - else
            Display a foo information here

显然,这里有很多问题。

  1. 我应该找一个聪明的成员告诉我如何写一个好的查询,这样我只需要做一次。
  2. 我认为我不应该有任何 if/else

我的目标是要么显示特定日期的内容,要么显示“创建新”链接,否则。

我在这里先向您的帮助表示感谢!!

4

1 回答 1

3

首先,我不知道this_date实际做了什么,但我假设它正在从您的数据存储中检索具有特定日期的记录。您可以使用日期范围将其压缩为一个,而不是执行 7 个查询:

Foo.where(date: (@date..(@date + 6.days)))

您可以附加 a.group_by(&:date)以返回类似于您手动构建的哈希的内容,但使用实际日期作为键而不是日期偏移量。

要遍历视图中的日期,我建议使用Hash#fetch,它允许您在键不存在时定义默认返回,例如:

hash = { :a => 1, :b => 2 }
hash.fetch(:a){ Object.new } #=> 1
hash.fetch(:c){ Object.new } # #<Object:...>

现在的问题是用什么对象代替nil。如果您想避免在此处使用条件,我建议您使用 NullObject 模式(您也可以让演示者参与进来,但这对您的情况来说可能有点矫枉过正)。这里的想法是,您将创建一个新类来替换丢失的 foo,然后简单地定义一个调用to_partial_path它的方法,该方法将告诉 Rails 如何呈现它:

class NullFoo
  def to_partial_path
    "null_foos/null_foo"
  end
end

您需要在两者上创建部分,app/views/foos/_foo.html.erbapp/views/null_foos/_null_foo.html.erb定义在每种情况下要呈现的内容。然后,在您看来,您可以简单地迭代:

<% (@date..(@date + 6.days)).each do |date| %>
  <%= render @foos.fetch(date){ NullDate.new } %>
<% end %>

这适合您的情况吗?也许这也有点矫枉过正,但总的来说,我认为养成尽可能避免 nil 检查的习惯是个好主意。NullObject 的另一个好处是,您可以在其上挂起各种行为,以在整个应用程序中处理这些情况。

于 2013-09-24T06:28:01.707 回答