2015-01-05 2 views
0

Мне нужен столбец временной метки, который обновляется только при обновлении определенных полей, например, если имя продукта изменяется, поле attributes_updated_at должно быть обновлено с помощью Time.now. Я не хочу, чтобы поле было обновлено в случае добавления ассоциации внешних ключей или если product.status изменяется с 'pending' на 'active'.Как обновить временную метку только при обновлении некоторых атрибутов?

Есть ли способ определить это просто в модели?

+0

вы можете просто использовать в 'before_save' так для обновления и сохранения' Model.record_timestamps = ложь, если product.status .changed? || self.association_id.changed? ' –

+0

@RajarshiDas, это похоже на большое предложение. Можете ли вы посоветовать мне, как я могу это использовать? Это определение уровня класса? –

+0

Пусть пользовательская модель вам нужно написать 'before_save: stop_update_time_stamps', а затем написать метод' def stop_update_time_stamp User.record_timestamps = false, если product.status.changed? || self.association_id.changed? end' вот так –

ответ

2

Вы можете попробовать это

Пусть считают вас есть Product модель

class Product < ActiveRecord::Base 
    belongs_to :user 
    before_save :stop_update_time_stamps 

    def stop_update_time_stamp 
    self.class.record_timestamps = false if self.status.changed? || self.user_id.changed? 
    end 
end 
0

Я считаю, что ваша проблема - проблема с базой данных, а не проблема с рубином.

Вы можете добиться желаемого поведения, используя, например, триггер базы данных (это код mysql).

CREATE TRIGGER trigger_product AFTER UPDATE ON product 
FOR EACH ROW 
BEGIN 
IF (NEW.name <> OLD.name) or (NEW.category <> OLD.category) 
    THEN set NEW.updated_at = NOW(); 

END; 
+0

Это похоже на круговое решение, которое не решает проблему в рамках. Я верю, что это сработает, но я работаю в предположении, что у меня нет доступа к созданию триггеров для БД. Однако, спасибо. –

Смежные вопросы