0

所以我有一個資產模型,它被圖像和文件作爲STI繼承。產品有很多圖像可以設置。這種多態關聯工作正常,但我無法弄清楚如何將user_id添加到每個資產。資產始終屬於用戶,無論它是圖像還是文件。請看下面的代碼。我很確定我需要在控制器創建方法中做些什麼,但我不確定是什麼?我試過合併:user_id,但這只是在查看控制檯日誌時返回nil。理想的情況是什麼,我也希望做的是@ user.images這將顯示用戶上傳,甚至@ user.filesSTI&Polymorphic association&user_id

class User < ActiveRecord::Base 
    has_many :products 
    has_many :assets 
end 

class Asset < ActiveRecord::Base 
    belongs_to :assetable, :polymorphic => true 
    belongs_to :user 
end 

class Image < Asset 
    mount_uploader :filename, ImageUploader 
    attr_accessible :filename, :assets 
end 

class Product < ActiveRecord::Base 
    belongs_to :user 

    has_many :images, as: :assetable 
    accepts_nested_attributes_for :images 

    attr_accessible :name, :price, :images_attributes 
    validates_presence_of :name 
end 

class ProductsController < ApplicationController 
def create 
    @product = Product.new(params[:product]) 
    @product.user_id = current_user.id 

    params[:product][:images_attributes].each do |key, image| 
    # image.user_id = current_user.id 
    image.merge(:user_id => 1) 
    end 

    @product.save 
end 
end 
+0

代碼的問題是什麼?你有錯誤或異常?不是'image.user_id = current_user.id'工作嗎? – KULKING

+0

我沒有收到任何錯誤。保存時,一切正常,但user_id下的資產表顯示爲'null',控制檯日誌顯示資產的MySQL插入爲'user_id = nil'。不,'image.user_id = current_user.id'不能工作,因爲它顯示爲零。 – Peter

+0

'image.merge!(:user_id => 1)'如果你願意,並且在包裝參數之前放置它。 :)但請看下一個答案 –

回答

0
def create 
    params[:product][:images_attributes].each do |key, image| 
    image.merge!(:user_id => current_user.id) 
    end 

    @product = Product.new(params[:product]) 
    @product.user_id = current_user.id 

    @product.save 
end 

順便說的所有圖像,你最好到將繼承邏輯替換爲模型:

class Image < Asset 
    mount_uploader :filename, ImageUploader 
    attr_accessible :filename, :assets 

    before_save do 
    self.user = assetable.try(:user) 
    end 
end 

# controller 

def create 
    @product = Product.new(params[:product]) 
    @product.user = current_user 
    @product.save 
end 
+0

感謝Valery您的'before_save'運作得非常好。你能解釋一下它究竟在做什麼嗎?任何可以學習的鏈接? – Peter

+0

它創建回調以在保存對象之前運行。 Look API http://api.rubyonrails.org(ActiveRecord :: Callbacks) –

+0

對不起,我的意思是'self.user = assetable.try(:user)'行 – Peter