1

Я использую жемчужину hair_trigger, и в моей модели я хочу сохранить изменения в некоторых столбцах.Добавить текущий идентификатор пользователя, чтобы вызвать SQL-запрос hair_trigger gem rails

trigger.after(:insert).declare("#{current_user.id} as current_user_id") do 
    "insert into histories (item_type, item_id, field, old_value, new_value, changed_by, created_at, updated_at) values ('CaseStatus', NEW.id, 'loan_case_id', '', NEW.loan_case_id, current_user_id, current_timestamp, current_timestamp);" 
    end 

Я думал, что я мог бы быть в состоянии объявить и передать current_user идентификатор в моем запросе, так что я могу сохранить пользователь, который сделал изменения, но я получаю сообщение об ошибке о 'undefined variable current_user'

Кто-нибудь знает, как я может сохранить пользователя, вызвавшего изменения, используя жемчуг hair_trigger в модели Rails.

Высокую оценку

+0

Но вы взглянули на драгоценный камень 'papertrail', он делает именно то, что вы ищете, отслеживает изменения в моделях. – Iceman

+1

Я знаю, что это не прямой ответ на ваш вопрос, но рассмотрели ли вы использование контрольной драгоценности? Взгляните на https://github.com/collectiveidea/audited или https://github.com/airblade/paper_trail –

+0

Я никогда не использовал этот драгоценный камень, можно ли даже отправлять параметры триггерной функции следующим образом? – Iceman

ответ

0

Как отмечалось ранее в комментариях не будет иметь доступ к current_user в ваших моделей по дизайну. Один из способов обойти это - использовать текущий поток. Люди часто стараются держаться подальше от этого, потому что он не совместим с параллелизмом при использовании веб-серверов, таких как Puma. Я настоятельно рекомендую использовать драгоценный камень Auditing, например Audited или PaperTrail, но если вы хотите сохранить свой подход, вы можете сделать что-то вроде этого.

# User.rb 
def self.current_user 
    Thread.current[:current_user] ||= nil 
end 

def self.current_user=(user) 
    Thread.current[:current_user] = user 
end 

Вы можете установить эту переменную в каждом запросе у вас есть CURRENT_USER, как в ApplicationController используя перед фильтром или даже вокруг фильтра, чтобы очистить его после этого.

# ApplicationController.rb 
before_action :share_current_user 

def share_current_user 
    User.current_user = current_user 
end 

Также взгляните на RequestStore. Это должно облегчить вашу жизнь.

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

  • Нет связанных вопросов^_^