麻烦写作动作

时间:2014-03-24 17:54:56

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

更新

我的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

1 个答案:

答案 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。现在还没有完成,所以黄金和白银都会停留。