【问题标题】:STI & Polymorphic association & user_idSTI & 多态关联 & user_id
【发布时间】:2013-02-04 11:50:56
【问题描述】:

所以我有一个资产模型,它被图像和文件作为 STI 继承。产品有许多图像作为资产。这种多态关联运行良好,但我不知道如何将 user_id 添加到每个资产。资产始终属于用户,无论它是图像还是文件。请看我下面的代码。我很确定在控制器创建方法中我需要做一些事情,但我不确定是什么?我试过合并 :user_id 但这只是在查看控制台日志时返回 nil 。理想情况下,我还想做的是@user.images,它将显示用户上传的所有图像,甚至是@user.files

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

【问题讨论】:

  • 代码有什么问题?您是否收到错误或异常? image.user_id = current_user.id 不工作吗?
  • 我没有收到任何错误。保存时,一切正常,但 user_id 下的资产表显示为“null”,控制台日志将资产的 MySQL 插入显示为“user_id = nil”。不,image.user_id = current_user.id 也不起作用,因为它显示为 nil。
  • image.merge!(:user_id =&gt; 1) 如果您愿意,请将其放在包装参数之前。 :) 但是看下一个答案

标签: ruby-on-rails ruby-on-rails-3 polymorphic-associations single-table-inheritance


【解决方案1】:
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

【讨论】:

  • 感谢 Valery,您的 before_save 工作得非常好。你能解释一下它实际上在做什么吗?有什么可以借鉴的链接吗?
  • 它创建回调以在对象保存之前运行。查看 API api.rubyonrails.org (ActiveRecord::Callbacks)
  • 对不起,我的意思是self.user = assetable.try(:user)
  • try(:user) 表示你试图获取 :user value of 'assetable': 如果方法响应了 value,则返回 value,否则返回 nil,即使 'assetable' 为 nil。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多