Выводя логику из поля зрения ... помогите с named_scope - PullRequest
1 голос
/ 19 ноября 2010

Я создал приложение, в котором я позволяю пользователям регистрировать свои тренировки.

Пользователь имеет возможность вести личный или общедоступный журнал своих тренировок и обозначается полем check_box, который передает целое число 1 в столбец workout.share. Личный журнал можно просмотреть через workouts_controller, где я ограничиваю весь вывод фильтрацией для current_user.

workouts_controller.rb

@workouts = current_user.Workouts.all

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

community_controller

@workouts = Workouts.all

и последующая фильтрация результатов в представлении со следующим

<% @workouts.each do |workout| %>
 <% if workout.share == 1 %> 
  ...
 <% end %>
<% end %>

Лучшее, что я могу сказать, это не самый предпочтительный способ сделать это, и я подозреваю, что я хочу named_scope, чтобы я мог создать новую переменную `@shared_workouts '. Тем не менее, я не знаком с именованными областями, поэтому могу использовать некоторую справку о том, куда поместить что и правильный синтаксис.

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Как упоминал Питер выше, используйте named_scope / scope в соответствии с версией Rails, которую вы используете. Также вы не хотите использовать значение 1 для вашего теста. Вы хотите использовать true (то есть, если вы использовали тип boolean в своей миграции).

Причина в том, что если вы измените базу данных, она может храниться по-другому (например, SQLite имеет логический тип, mySQL использует крошечный int ...), и активная запись будет управлять вами. :)

class Workout < ActiveRecord::Base
  named_scope :shared, :conditions => {:share => true}
end

или

class Workout < ActiveRecord::Base
  scope :shared, where(:share => true)
end

Затем используйте «Workouts.shared» для доступа к named_scope.

1 голос
/ 19 ноября 2010

Если вы используете рельсы 2, используйте следующее:

class Workout < ActiveRecord::Base
  named_scope :shared, :conditions => {:share => 1}
end

Если вы используете рельсы 3, используйте вместо этого:

class Workout < ActiveRecord::Base
  scope :shared, where(:share => 1)
end

Тогда в контроллере сообщества вы можете просто использовать @workouts = Workouts.shared.all

...