更新
我的Miniatures模型中有一个名为set_gold_and_silver
的动作。
我希望我的用户模型在销毁用户时运行它,所以我的用户模型中有before_destroy :set_gold_and_silver
。
用户有很多Imagevotes。在销毁之前,我需要删除那些Imagevotes,然后在这些imagevotes所涉及的所有缩图上运行set_gold_and_silver
。
这是我到目前为止所得到的,而且我目前正在undefined method 'miniatures'
。
我不清楚我是否正在缓存self.imagevotes或者它们是否刚被删除然后我收到错误因为它们不再存在?
def set_gold_and_silver
votes = self.imagevotes
self.imagevotes.destroy
votes.miniatures.uniq.each(&:set_gold_and_silver)
end
我的模特
用户
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
has_many :collections, dependent: :destroy
has_many :miniatures, through: :collections
has_many :imagevotes, foreign_key: "voted_id", dependent: :destroy
has_many :imagevotes, foreign_key: "voter_id", dependent: :destroy
before_destroy :set_gold_and_silver
def set_gold_and_silver
my_collections = self.collections.each
their_miniatures = collection.miniature.uniq
my_collections.their_miniatures.each(&:set_gold_and_silver)
end
end
微型
class Miniature < ActiveRecord::Base
has_many :collections, dependent: :destroy
has_many :users, :through => :collections
has_many :imagevotes, dependent: :destroy
def set_gold_and_silver
wipe = self.collections.all
wipe.each {|s| s.update_attributes :is_gold => false, :is_silver => false}
top_collections = self.collections.limit(4)
gold = top_collections.shift
gold.update_attribute :is_gold, true if gold
top_collections.each {|s| s.update_attribute :is_silver, true}
end
end
集合
class Collection < ActiveRecord::Base
default_scope order('imagevotes_count DESC')
belongs_to :miniature
belongs_to :user
has_many :imagevotes, dependent: :destroy
end
Imagevote
class Imagevote < ActiveRecord::Base
belongs_to :collection, :counter_cache => true
belongs_to :voter, class_name: "User", :counter_cache => "voted_count"
belongs_to :voted, class_name: "User", :counter_cache => "vote_count"
belongs_to :miniature
after_create :set_gold_and_silver
after_update :set_gold_and_silver
def set_gold_and_silver
self.miniature.set_gold_and_silver
end
end
答案 0 :(得分:1)
您需要使代码更简单:
class Miniature < ActiveRecord::Base
def set_gold_and_silver
self.collections.update_all("is_gold = false, is_silver = false")
top_collections = self.collections.limit(4)
gold = top_collections.shift
gold.update_attribute :is_gold, true if gold
top_collections.each {|s| s.update_attribute :is_silver, true}
end
end
class User < ActiveRecord::Base
def set_gold_and_silver
self.miniatures.uniq.each(&:set_gold_and_silver)
end
end
你有has_many:minatures,通过:: collection所以你不需要使用集合来获取minuatures。
现在你的代码无法正常工作,因为在销毁之前一切仍然存在 。它需要在所有依赖于用户的东西被移除之后完成。而且对我来说,你需要在用户destroy和set_gold_and_silver之后删除imagevotes。现在还没有完成,所以黄金和白银都会停留。