Ruby on rails 当ruby(RoR)中的查询没有返回任何内容时,用nils填充数组

Ruby on rails 当ruby(RoR)中的查询没有返回任何内容时,用nils填充数组,ruby-on-rails,ruby,haml,Ruby On Rails,Ruby,Haml,我有一个名为foo的模型,带有日期字段 在我的索引视图中,我显示了一个特定星期的典型“每周视图”。为了将数据放在我的视图中,我循环指定周的每一天,每次查询一天数据。我这样做是为了确保在正确的日期输入零 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

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

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

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
显然,这里有很多错误

  • 我应该找一个聪明的成员来告诉我如何编写一个好的查询,这样我只需要做一次
  • 在我看来,我不应该有任何“如果/否则”
  • 我的目标是,如果某一天有内容,则显示内容;如果没有,则显示“新建”链接


    提前谢谢你的帮助

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

    Foo.where(date: (@date..(@date + 6.days)))
    
    您可以在
    .group\u by(&:date)
    上添加一个标记,以返回类似于手动构建的哈希值的内容,但使用实际日期作为键,而不是日期偏移量

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

    hash = { :a => 1, :b => 2 }
    hash.fetch(:a){ Object.new } #=> 1
    hash.fetch(:c){ Object.new } # #<Object:...>
    
    您需要在
    app/views/foos/_-foo.html.erb
    app/views/null\u-foos/_-null\u-foo.html.erb
    中创建部分,定义每种情况下的渲染内容。然后,在您看来,您可以简单地迭代:

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

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

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

    Foo.where(date: (@date..(@date + 6.days)))
    
    您可以在
    .group\u by(&:date)
    上添加一个标记,以返回类似于手动构建的哈希值的内容,但使用实际日期作为键,而不是日期偏移量

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

    hash = { :a => 1, :b => 2 }
    hash.fetch(:a){ Object.new } #=> 1
    hash.fetch(:c){ Object.new } # #<Object:...>
    
    您需要在
    app/views/foos/_-foo.html.erb
    app/views/null\u-foos/_-null\u-foo.html.erb
    中创建部分,定义每种情况下的渲染内容。然后,在您看来,您可以简单地迭代:

    <% (@date..(@date + 6.days)).each do |date| %>
      <%= render @foos.fetch(date){ NullDate.new } %>
    <% end %>
    
    
    
    这适合你的情况吗?也许这也有点过分,但总的来说,我认为养成尽可能避免零检查的习惯是个好主意。NullObject的另一个好处是,您可以在其上挂起各种各样的行为,在整个应用程序中处理这些情况