2016-08-19 12 views
0

categoryの列が変更されたときに何かを表示することです。Rails:以前の値を比較する方法

しかし、最後のデータには何も表示されません。

たとえば、Eventモデルのデータは次のとおりです。私は、以下のように表示されません02:00 (change category)最後のデータを表示したいのですが何が、

id start_at category 
1 02:00  3 
2 03:00  2 
3 04:00  1 

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

なぜあなたは 'if'を削除しないのですか?つまり、あなたがその値を表示したいのであれば、' if'が表示されないようにしていれば...それ以外は何か、私は知らない。 – fanta

答えて

2

...

<% category = nil %> 
<% @events.each do |event| %> 
    <% if event.category != category %> 
     <%= event.start_at %> (change category)<br> 
     <% category = event.category %>  
    <% end %> 
<% end %> 
+0

答えてくれてありがとう、@ SteveTurczyn。できます!私がしたいことを理解していただきありがとうございます。 – SamuraiBlue

0

私はあなたが何をしたいかわからないんだけど。

前の値を知りたい場合は、モデルに1つのフィールドを追加することができます。また、start_at値を更新するたびに古い値フィールド(nilまたはempty_stringで始まる)を更新することを忘れないでください。

これを行い、フィールドの古い値を記憶するより一般的な方法は、異なるモデル属性を指す新しいテーブルを生成することです。この新しいテーブルには、少なくともchangeable_type:string、changeable_id:integer、attribute_name:文字列、attribute_value:文字列(id、created_at、updated_atはデフォルトで作成されます)が含まれている必要があります。そして、あなたはモデルが古い値を保存するためにafter_saveコールバックのメソッドを変更する使用することができます。このイベントモデル

# 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 
  • ショートバージョン に追加することができます。これを利用する前のコードでは、そのテーブルの任意のテーブルやフィールドに変更を保存できる多態性テーブルにその値を格納しています。
関連する問題