【问题标题】:Rails - counter_cache not workingRails - counter_cache 不工作
【发布时间】:2017-02-09 13:36:49
【问题描述】:

我正在使用 Rails 构建一个活动应用程序,并在我的 Event 和 Booking 模型之间添加了一个 counter_cache 关联,以便捕获每个活动的预订数量。

我在我的活动展示页面中添加了一行代码,专门用于活动的创建者,以向他们展示已经进行了多少预订 -

 <% 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 个预订)-

当我尝试添加预订时,它不会更新。我做错了什么?

这是我将 bookings_count 添加到我的 Events 表时的迁移 -

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

我需要向我的事件模型添加任何东西吗?

【问题讨论】:

  • 附注:从迁移内部引用模型(即Event)是个坏主意。这是因为如果您重命名它们,您的旧迁移将变得无效(由于未定义的常量/方法导致的语法错误)。此外,您在 change 方法中放置初始化逻辑 (Event.update_counters) 的方式使得迁移以其当前形式不可逆转!
  • 谢谢你,我不知道。这就是在 Railscasts 上完成的方式,尽管这些是相当古老的视频。知道如何解决这个问题吗?
  • 你能调试你在迁移中更新的值吗?简单地说 e.bookings.length
  • 有趣的是,当我从 event.bookings_count.size 更改为 event.bookings_count 时,它似乎确实可以工作,尽管它不能识别数量,所以如果我在一个活动中预订 2 个空间,那么只有预订号增加 1 而不是 2。
  • @Mike.Whitehead rails cast episode 正在使用updown 方法,这就是为什么它们的迁移是可逆的,而您的迁移却不是!然而,在迁移中不包括模型的概念是社区随着时间的推移学到的一个教训——因为起初它会导致什么问题并不那么明显。

标签: ruby-on-rails ruby ruby-on-rails-4 associations rails-activerecord


【解决方案1】:

这只是我的一个糟糕的代码案例,我使用了 -

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

其实应该是-

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

但是,这仍然会使用数据库进行计数,因此,会使 counter_cache 的使用变得多余,因此使用它 -

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

为我提供了我正在寻找的输出,并以预期的方式利用 counter_cache。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多