ruby on rails 在模型内部实例化?
ruby on rails Instantiating inside a model?
我是 rails 的新中级(:D),我开始处理更复杂的项目,需要多个 class 和与我的模型互动,我有点迷失了如何 design/order 我的代码。
我有一个product_table和一个product_details_table。
每次创建产品时都会上传一张图片。
在 class 产品中,我创建了一些方法来填充与该图像相关的该产品的虚拟属性(尺寸等)。
这一切都在上传后使用回形针回调。
我的问题是,根据该图像大小,我想在 product_details table.
中自动生成属性值
Product_details.new(product_id:current_product_id(**is it self.id here?**),size:product.virtual_attribut_size,x:virtual_attribut_x)
你会怎么做?
我会在我的控制器中完成,但必须在文件上传后自动完成,而不是之前,我不知道该怎么做。
如果我在我的模型中这样做,我猜它可以工作(作为一个正常的 class)但这是这样做的方式吗?
感谢那些试图提供帮助的人
编辑:
我的产品模型基本上是这样的:
class Product < ActiveRecord::Base
def image_to_inch
#return "30x30" (in inch) for an image uploaded in pixel (divide the number of pixel by 300dpi to get a good quality print )
end
def image_printable_size
#use previous method result to output an array of all printable size from a list of predifined sizes. example : 30x30 can be printed in 30x30,20x20,10x10 but not 40x40.
#output ["30x30","20x20","10x10"]
end
##Here i should iterate over the array and create a product_details line for that product for each size :
## simplified version of what i was going for and that look really really ugly :
["30x30","20x20","10x10"].each do |size|
ProductDetail.create!(product_id:self.id,size:size)
end
end
我省略了回调、验证等。这样更容易阅读。
您的要求不明确,但这里有一些策略提示。
- 使用 before_save 或 after_save 回调来自动化代码。
- 使用 attr_accessor 变量保存由 before_save 和 after_save 回调
使用的临时对象
- 用简单的方法做简单的事。请记住,您可以编写自己的自定义 getter 和 setter 方法。
所以,您的方法可能是这样的:我在猜测您的架构,所以不要太在意细节。
class Product
has_one :product_detail
after_save :update_product_details
def update_product_detail
product_detail = self.product_detail || self.product_detail.build
if self.image
product_detail.update_from_image(self.image)
end
product.save
end
class ProductDetail
belongs_to :product
def update_from_image(image)
self.size = image.size
#... any other settings taken from the image
end
我是 rails 的新中级(:D),我开始处理更复杂的项目,需要多个 class 和与我的模型互动,我有点迷失了如何 design/order 我的代码。
我有一个product_table和一个product_details_table。
每次创建产品时都会上传一张图片。
在 class 产品中,我创建了一些方法来填充与该图像相关的该产品的虚拟属性(尺寸等)。 这一切都在上传后使用回形针回调。
我的问题是,根据该图像大小,我想在 product_details table.
中自动生成属性值Product_details.new(product_id:current_product_id(**is it self.id here?**),size:product.virtual_attribut_size,x:virtual_attribut_x)
你会怎么做?
我会在我的控制器中完成,但必须在文件上传后自动完成,而不是之前,我不知道该怎么做。
如果我在我的模型中这样做,我猜它可以工作(作为一个正常的 class)但这是这样做的方式吗?
感谢那些试图提供帮助的人
编辑:
我的产品模型基本上是这样的:
class Product < ActiveRecord::Base
def image_to_inch
#return "30x30" (in inch) for an image uploaded in pixel (divide the number of pixel by 300dpi to get a good quality print )
end
def image_printable_size
#use previous method result to output an array of all printable size from a list of predifined sizes. example : 30x30 can be printed in 30x30,20x20,10x10 but not 40x40.
#output ["30x30","20x20","10x10"]
end
##Here i should iterate over the array and create a product_details line for that product for each size :
## simplified version of what i was going for and that look really really ugly :
["30x30","20x20","10x10"].each do |size|
ProductDetail.create!(product_id:self.id,size:size)
end
end
我省略了回调、验证等。这样更容易阅读。
您的要求不明确,但这里有一些策略提示。
- 使用 before_save 或 after_save 回调来自动化代码。
- 使用 attr_accessor 变量保存由 before_save 和 after_save 回调 使用的临时对象
- 用简单的方法做简单的事。请记住,您可以编写自己的自定义 getter 和 setter 方法。
所以,您的方法可能是这样的:我在猜测您的架构,所以不要太在意细节。
class Product
has_one :product_detail
after_save :update_product_details
def update_product_detail
product_detail = self.product_detail || self.product_detail.build
if self.image
product_detail.update_from_image(self.image)
end
product.save
end
class ProductDetail
belongs_to :product
def update_from_image(image)
self.size = image.size
#... any other settings taken from the image
end