Подводные камни Thread.local [: current_user] - PullRequest
2 голосов
/ 28 июня 2011

Этот вопрос относится к: Доступ к current_user в модели .

В частности, я хочу разрешить доступ к current_user в одном Model.rb. @moif оставил комментарий о том, что решение не является поточно-ориентированным, и я прочитал, что существуют дополнительные предостережения при использовании этого процесса.

У меня такой вопрос - если бы я добавил:

def self.current_user
    Thread.local[:current_user]
end

def self.current_user=(usr)
    Thread.local[:current_user] = usr
end

to one Model.rb (используется только слегка и нечасто), каковы практические последствия для моего приложения и есть ли что-то еще, что я должен сделать, чтобы гарантировать его здоровье?

Настройка: Rails 1.9, Rails 3.0, Heroku, Authlogic.

1 Ответ

1 голос
/ 28 июня 2011

Я не уверен, что согласен с тем путем, по которому вы идете.Я согласен с другим постом, что передача current_user модели не подходит, но я бы не стал использовать Thread.local для этого.И вот почему:

  1. Разработчики любят использовать технические решения, и «ближе к системе» вы можете получить не намного больше, чем Thread.local.Если вы использовали Thread.locals до того, как они стали очень сложными, и если вы не понимаете это правильно, вы тратите бесчисленные часы, пытаясь выяснить проблему, не говоря уже о ее решении.Также трудно найти тестировщиков, которые могут понять сложности Thread.local и быть в состоянии тщательно протестировать код.На самом деле, мне было бы интересно узнать, сколько разработчиков собрали твердые тесты rspec (или эквивалентные) для чего-то подобного.«Стоимость» этого решения, возможно, не стоит того.

  2. Я думаю, что я хотел бы взглянуть на то, что вы пытаетесь сделать, и посмотреть, есть ли более простое решение.Например, я могу подумать о двух несуществующих (может быть, сработает или нет в вашем случае):

a) подключить вашу таблицу истории к вашей пользовательской таблице с помощью внешнего ключа."has_many"или
b) передать имя пользователя с помощью attr_accessor в истории и установить его при создании объекта.

...