Ruby on rails 当ruby(RoR)中的查询没有返回任何内容时,用nils填充数组
我有一个名为foo的模型,带有日期字段 在我的索引视图中,我显示了一个特定星期的典型“每周视图”。为了将数据放在我的视图中,我循环指定周的每一天,每次查询一天数据。我这样做是为了确保在正确的日期输入零 foos_controller.rbRuby 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
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的另一个好处是,您可以在其上挂起各种各样的行为,在整个应用程序中处理这些情况