1

我正在使用hair_trigger gem,並且在我的模型中,我想保留對某些列的更改。添加當前用戶ID以觸發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 ID在我的查詢,以便我能救誰進行了改變的用戶,但我得到'undefined variable current_user'

有誰知道一個錯誤,我怎麼可以在Rails模型中使用hair_trigger gem保存觸發更改的用戶。

非常感謝

+0

但你有沒有看過'papertrail'寶石,它確實是你要找的,跟蹤模型的變化。 – Iceman

+1

我知道這不是對你的問題的直接回應,但你有沒有考慮使用審計寶石?看看在https://github.com/collectiveidea/audited或https://github.com/airblade/paper_trail –

+0

我從來沒有使用過這個寶石,甚至有可能發送參數到觸發器功能? – Iceman

回答

0

正如你將不必通過設計獲得current_user您模型中的意見如前所述。避免這種情況的一種方法是使用當前線程。人們經常試圖遠離這一點,因爲在使用諸如Puma之類的網絡服務器時,它並不友好。我強烈建議使用像AuditedPaperTrail這樣的審覈寶石,但是如果你想保持你的方法,你可以做這樣的事情。

# 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。它應該讓你的生活更輕鬆地完成這一點。