1

Я создаю приложение событий с использованием Rails и добавил связь counter_cache между моделями Event и Booking, чтобы зафиксировать количество заказов, сделанных на каждом событии.Rails - counter_cache не работает

I'v добавил строку кода к моей странице шоу Event специально для создателя события, чтобы показать им, сколько заказов было сделано -

<% if user_signed_in? and current_user == @event.user %> 
         <button><%= link_to "Edit", edit_event_path %></button> 
         <button> <%= link_to "Delete", event_path, method: :delete, data: { confirm: "Are you sure?"} %></button> 
         <p><%= pluralize @event.bookings_count.size, 'booking' %></p> 

Все текущие события я настроил (8 заказов) - Example for bookings

При попытке добавить заказ он не обновляется. Что я делаю не так?

Это моя миграция из когда я добавил bookings_count к моей таблице событий -

class AddBookingsCountToEvents < ActiveRecord::Migration 
    def change 
    add_column :events, :bookings_count, :integer, default: 0 
    Event.reset_column_information 
    Event.all.each do |e| 
     Event.update_counters e.id, :bookings_count => e.bookings.length 
    end 


    end 
end 

мне нужно добавить что-нибудь в моем контроллере мероприятия? Я установил мою модель бронирования в соответствии с инструкциями -

belongs_to :event, counter_cache: true 

Нужно ли что-либо добавить к моей модели событий?

+1

Замечание небольшой стороны: Плохая идея ссылаться на модели (т. Е. «Событие») изнутри миграции. Это связано с тем, что если вы когда-либо переименовали их, ваши старые миграции станут недействительными (синтаксические ошибки из-за неопределенных констант/методов). Кроме того, способ, которым вы поместили логику инициализации ('Event.update_counters') внутри метода' change', делает миграцию необратимой в ее текущей форме! –

+0

Спасибо за это, я не знал. Так было на Railscasts, хотя это довольно старые видео. Любая идея, как я могу исправить проблему? –

+0

Можно ли отладить значение, которое вы обновляете при миграции? просто ставит e.bookings.length –

ответ

0

Это был просто случай плохого кода с моей стороны, я -

<p><%= pluralize @event.bookings_count.size, 'booking' %></p> 

Это на самом деле должно было быть -

<p><%= pluralize @event.bookings.size, 'booking' %></p> 

Однако, это было бы еще использовали базу данных для подсчета , таким образом, используя избыточность counter_cache, используя это значение -

<p><%= pluralize @event.bookings_count, 'booking' %></p> 

дает мне e, который я искал, а также используя counter_cache в том, как это было предусмотрено.

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

  • Нет связанных вопросов^_^