gpt4 book ai didi

ruby-on-rails - 删除 has_many :through association doesn't change model's updated_at attribute

转载 作者:行者123 更新时间:2023-12-04 11:26:52 25 4
gpt4 key购买 nike

我很难让updated_at 列更新一个Casino 模型,该模型通过CasinoAmenity 拥有_many Amenities。赌场的 updated_at 列在添加便利设施时会正确更新,但在删除设施时不会。

这是我的(简化)模型:

赌场.rb

class Casino < ActiveRecord::Base
has_many :amenity_casino, :dependent => :destroy
has_many :amenities, :through => :amenity_casino
end

amenity_casino.rb
class AmenityCasino < ActiveRecord::Base
belongs_to :casino, :touch => true
belongs_to :amenity, :touch => true
end

便利设施.rb
class Amenity < ActiveRecord::Base
has_many :amenity_casinos, :dependent => :destroy
has_many :casinos, :through => :amenity_casinos
end

现在到控制台。检查初始 updated_at 时间。
> Casino.find(5).updated_at
=> Wed, 30 Jan 2013 00:30:04 UTC +00:00

为赌场增添便利设施。
> Casino.find(5).amenities << Amenity.first
=> [#<Amenity id: 1, name: "asdf", weight: "", created_at: "2012-11-10 02:29:14", updated_at: "2013-01-30 01:29:14", description: "asdf">]

确认关联已保存到数据库
> Casino.find(5).amenities
=> [#<Amenity id: 1, name: "asdf", weight: "", created_at: "2012-11-10 02:29:14", updated_at: "2013-01-30 01:29:14", description: "asdf">]

正如预期的那样,我们可以看到该赌场的 updated_at 时间发生了变化。
> Casino.find(5).updated_at
=> Wed, 30 Jan 2013 01:29:14 UTC +00:00

现在让我们从赌场中删除该设施。
> Casino.find(5).amenities = []
=> []

现在确保它击中了数据库
> Casino.find(5).amenities
=> []

现在让我们检查一下赌场的 updated_at 列...
> Casino.find(5).updated_at
=> Wed, 30 Jan 2013 01:29:14 UTC +00:00

如您所见,这与我们从赌场中移除便利设施之前相同。我还尝试了 AmenityCasino 上的 before_destroy 过滤器来接触赌场,但这似乎并没有奏效。

我很想听听这里是否有人有任何解决方案。如果重要的话,我正在使用 ActiveAdmin 来管理一切。

Rails 版本是 3.2.11

最佳答案

首先,您在 amenity_casino 的末尾缺少一个“s”在您的 Casino 中的两个地方模型。

应该是这样的:

class Casino < ActiveRecord::Base
has_many :amenity_casinos, :dependent => :destroy
has_many :amenities, :through => :amenity_casinos
end

不过,这并不能解决这里的问题。引用 this (somewhat old) SO answer ,看起来问题是连接表条目被删除,而不是销毁,删除不会触发 touch方法,因此 updated_at没有更新。

为了解决这个问题,你可以添加一个 :after_remove选择您的协会并传递 proc其中调用 touch在模型本身上:
has_many :amenity_casinos, :dependent => :destroy
has_many :amenities, :through => :amenity_casinos,\
:after_remove => proc { |a| a.touch }

我已经测试过了,它似乎有效:
Casino.find(5).updated_at
#=> Wed, 30 Jan 2013 03:21:29 UTC +00:00
Casino.find(5).amenities << Amenity.first
#=> [#<Amenity id: 1, name: nil, created_at: "2013-01-30 02:48:49", updated_at: "2013-01-30 03:25:23">]
Casino.find(5).amenities
#=> [#<Amenity id: 1, name: nil, created_at: "2013-01-30 02:48:49", updated_at: "2013-01-30 03:25:23">]
Casino.find(5).updated_at
#=> Wed, 30 Jan 2013 03:25:23 UTC +00:00
Casino.find(5).amenities = []
#=> []
Casino.find(5).updated_at
#=> Wed, 30 Jan 2013 03:27:33 UTC +00:00

您可以看到时间戳已更改。您必须为您的 Amenity 做同样的事情如果您想拥有 updated_at 的模型属性也更新了那个。

关于ruby-on-rails - 删除 has_many :through association doesn't change model's updated_at attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com