2014-03-24 118 views
0

UPDATE麻煩的寫入動作

我有我叫set_gold_and_silver微縮模型的操作。

我希望我的用戶模型在用戶銷燬時運行它,所以我的用戶模型中有before_destroy :set_gold_and_silver

用戶有很多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

編輯的問題。 – Ossie

回答

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:微縮模型,通過:集合,所以你不需要工作用集合來獲得細節。

而現在你的代碼不工作,因爲一切仍然存在之前銷燬。它需要在用戶移除所有內容後完成。同樣,對我來說,你需要在用戶銷燬和set_gold_and_silver後刪除imagevotes。目前尚未完成,所以黃金和白銀仍然存在。

+0

感謝代碼簡化。我認爲,如果我做了after_destroy,我將無法找到需要set_gold_and_silver的User.collections? – Ossie

+0

因此,在這種情況下,您需要在before_destroy中查找屬於用戶的所有縮圖,銷燬屬於我們用戶的所有圖片,並在其上調用set_gold。 –

+0

是的。對於第二步,圖像投影將被自動銷燬,因爲它們是依賴的,並將被用戶權利銷燬?所以我只需要銷燬前後的操作? – Ossie