2012-04-30 5 views
1

Я пытаюсь разобраться с концепцией запросов named_scoped в рельсах. Я пытаюсь отфильтровать таблицу, чтобы получить только невооруженные элементы (: featured => false).Запросы Rails и named_scope

В моей модели я добавил

Область применения: allgames, где (: признаки => ложь) и область применения: признаки, где (показанная => правды)

Я пытаюсь список все признанные и не включенные элементы отдельно на моей индексной странице игры.

Возможно ли это через именованный объем.

До сих пор у меня есть:

<% @games.each do |item| %> 
    <% if item.featured %> 
    <%= render 'application/item_synopsis_builder', item: item %> 
    <% end -%> 
<% end %> 

И мне интересно, если это возможно сделать что-то вроде:

<% @games.featured.each do |item| %> 
    <%= render 'application/item_synopsis_builder', item: item %> 
<% end %> 

или

<%= render partial: 'application/item_synopsis_builder', collection: @games.featured %> 

Когда я пытаюсь я получаю сообщение говоря, что нет метода. Но когда я запускаю команду Game.featured в консоли, я получаю список результатов всех признанных игр.

Доступ к этому списку/методам доступен при просмотре?

ответ

3

Именованные области добавляются в модель как метод класса, поэтому попытка доступа к методу в коллекции объектов не будет работать. Подобная функциональность может быть достигнута с:

@games.where(:featured => true).each do 
     ... 
    end 

Но я рекомендовал бы две переменные в контроллере:

@featured_games = Games.featured 
    @all_games  = Games.allgames 

затем использовать те, в ваших взглядах.

+0

Yop Я просто попробовал это в контроллере, и он отлично работает. Просто подумал, что можно получить доступ к нему, чтобы просмотреть его. Во всяком случае, это просто потрясающе.Спасибо за вашу помощь. –

+0

Чтобы сделать это прямо в представлении, используйте Games.featured в представлении вместо установки переменной экземпляра в контроллере. <% Games.featured.each do | item | %> –

+0

Правильное место для доступа к данным находится в контроллере. Хотя вы можете делать ActiveRecord find в представлениях или помощниках, это не рекомендуется. –

0

Сфера - метод класса (или ассимилируемый, я не знаю специфики), так что да, Game.featured будет работать, но когда вы делаете @ games.featured, вы вызываете featured на массив Game экземпляров.

3

Ваши представления управляются переменной экземпляра @games, созданной контроллером, который визуализирует представления. Именованные области создают метод класса для подклассов ActiveRecord :: Base. Поэтому «Game.featured» возвращает что-то, потому что определение именованной области создало метод для класса Game. Это не не создать метод экземпляра, который могут вызвать объекты класса Game (такие как @games). Вот почему «@ games.featured» дает вам ошибку.

Чтобы сделать то, что вы хотите сделать, создайте в контроллере две переменные экземпляра и передайте их в представление, например.

@all_games = Game.allgames 
@featured_games = Game.featured 

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

+1

Черт тебя, одновременная публикация! –

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