如何将模型中不存在的属性添加到rails中的对象?

时间:2014-11-18 11:22:05

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

我有一个要求,我想在对象中添加一个属性,以便识别它所属的类型

dresses = Cloth.select("id as id and cloth_name as name")

我想添加cloth_type以及每个结果对象,这个cloth_type实际上并不存在于我的模型中,但我需要添加它。那我怎么能这样做呢?

比如说

dresses.cloth_type = "jeans"

,结果应该是

{"id" : 1, "name" : "dress1", "cloth_type" : "jeans"}

我实际上尝试过assign_attributes,write_attributes和update,但似乎没有。

请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:5)

您只需在模型中添加attr_accessor

class Cloth < ActiveRecord::Base
   attr_accessor :cloth_type
end


c = Cloth.first
c.cloth_type = "whatever"
c.cloth_type # => "whatever"

您还可以使用select方法将属性添加到所有记录(它不是传统意义上的属性)。

clothes = Cloth.select("*, 'whatever' as cloth_type")
clothes.first.cloth_type # => "whatever"

答案 1 :(得分:0)

如果你想处理几种类型的对象,只保留数据库中的一个表(这里是衣服或其他许多衣服),你可以使用STI。如果你需要为每个对象实现不同的行为,它将允许你有几个对象。 如果不这样做,您可以创建一个迁移,在表中添加名为“cloth_type”的列,然后将其放入您的类中:

scope :dresses, -> { where(cloth_type: 'dress') } 

然后你应该可以访问Clothes.dresses。 或者你可以这样做:

dresses = Cloth.where(cloth_type: 'dress')