Rails:如何比较以前的值

时间:2016-08-19 21:04:57

标签: ruby-on-rails ruby-on-rails-4

我想要做的是在更改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)没有显示的原因(因为以前的数据不存在)。

如果您能告诉我如何实现我想做的事情,我们将不胜感激。

2 个答案:

答案 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
  • 简短版 您可以在after_save回调上使用模型更改方法来存储旧值。之前的代码利用此方法将该值存储在多态表中,该表可以存储任何表和该表的任何字段的任何更改。