我想要做的是在更改category
列时显示内容。
但是最后的数据并没有显示任何内容。
例如Event
模型中的数据如下;
id start_at category
1 02:00 3
2 03:00 2
3 04:00 1
虽然我希望显示如下内容,但最后一个数据02:00 (change category)
无法显示。
04:00
03:00 (change category)
02:00 (change category)
模型
class Event < ActiveRecord::Base
default_scope -> { order(category: :asc, start_at: :asc) }
def previous
Event.where("id < ?", self.id).order("category ASC, start_at ASC").first
end
查看
<% @events.each do |event| %>
<% if event.previous %>
<%= event.start_at %> (change category)<br>
<% end %>
<% end %>
我知道02:00 (change category)
没有显示的原因(因为以前的数据不存在)。
如果您能告诉我如何实现我想做的事情,我们将不胜感激。
答案 0 :(得分:2)
您可以使用一个简单的变量执行此操作,而且您不需要执行额外的数据库调用...
<% category = nil %>
<% @events.each do |event| %>
<% if event.category != category %>
<%= event.start_at %> (change category)<br>
<% category = event.category %>
<% end %>
<% end %>
答案 1 :(得分:0)
我不确定你想做什么。
如果您只想知道以前的值,可以向模型添加一个字段,每当更新start_at值时,您必须记住更新旧值字段(应该从nil或empty_string开始)。
更通用的方法是执行此操作并记住字段的旧值,可以生成指向不同模型属性的新表。此新表至少应包含:changeable_type:string,changeable_id:integer,attribute_name:string,attribute_value:string(id,created_at,updated_at默认创建)。然后你可以添加到这个事件模型
# in this example Change is the name of this new model, and it has -> belongs_to :changeable, polymorphic: true
class Event < ActiveRecord::Base
has_many :changes, as: :changeable
default_scope -> { order(category: :asc, start_at: :asc) }
after_save :store_old_start_at_value
def store_old_start_at
old_value = self.changes[:start_at]
if old_value #
Change.create(changeable: self, attribute_name: 'start_at', attribute_value: old_value[0])
end
end
def previous_start_values
Change.where(changeable_type: self.class.name, changeable_id: self.id, attribute_name: 'start_at').map(&:attribute_value)
end
end