【发布时间】: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>
当我尝试添加预订时,它不会更新。我做错了什么?
这是我将 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 正在使用
up和down方法,这就是为什么它们的迁移是可逆的,而您的迁移却不是!然而,在迁移中不包括模型的概念是社区随着时间的推移学到的一个教训——因为起初它会导致什么问题并不那么明显。
标签: ruby-on-rails ruby ruby-on-rails-4 associations rails-activerecord