Перейдите от контроллера (который скоро станет худым) к модели (не такой толстой) - PullRequest
0 голосов
/ 29 апреля 2011

Я почти не понимаю рельсы, не говоря уже о рубине, так что это, вероятно, легко. В одном из действий show моего контроллера у меня есть переменная, которую я определил для вычисления суммы некоторых элементов, выглядит примерно так:

@total_of_items = SomeModel.where(:user_id => @user).sum(:amount)

Это, очевидно, собирает все атрибуты количества этого конкретного пользователя и складывает их. Поэтому, на мой взгляд, я просто звоню:

<%= @total_of_items %>

И это проявляется. Итак, два вопроса. Во-первых, действительно ли это лучший способ сделать что-то подобное? Потому что я могу захотеть взять это значение и показать его в виде другого пользователя, чтобы сравнить их или что-то в этом роде. Кажется, для того, чтобы сделать это, это должен быть метод в модели? Я просто не уверен.

Мой второй вопрос - как взять переменную, определенную в контроллере, и поместить ее в модель. Похоже, что это более «тощий контроллер толстой модели» способ ведения дел. Маленькая помощь?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Здесь появляется scopes.В вашей модели:

scope :sum_by_user, lambda {|user| where(:user_id => user).sum(:amount) }

Тогда в вашем контроллере:

@total_of_items = SomeModel.sum_by_user(@user)

Вы можете даже объединить прицелы, что действительно здорово.

0 голосов
/ 29 апреля 2011

Вы можете упростить свой контроллер, создав область (как демонстрирует @apneadiving) или с помощью метода, который инкапсулирует запрос:

def self.amount_sum(user)
  where(:user_id => user).sum(:amount)
end

тогда в вашем контроллере:

@total_of_items = SomeModel.amount_sum(@user)

В этом случае я бы использовал метод, потому что область видимости немного сложнее для чтения. Райан Бейтс отмечает это в своем Railscast 215 :

Во второй именованной области мы используем лямбда Если вы когда-либо используете один из этих в именованной области вы можете рассмотреть используя вместо этого метод класса особенно если вы проходите в большое количество параметров или, если Содержание области является сложным. наш довольно просто, но мы перевернем его в любом случае в метод класса.

Ваш случай довольно прост, но я бы подумал о размещении логики внутри метода класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...