2

遵循单一职责原则,我想将一些属性和状态放在一个单独的类中,但是,我希望它在同一个表中。

例子:

class Person
  attr_accessible :name, :age
end

class Measures
  attr_accessible :weight, :height, :other_attrs
end

如何合成MeasuresPersonMeasure数据存储在persons表中?

4

2 回答 2

3

ActiveRecord 包含一个特定的功能。

class Person
  composed_of :measures
end

如果无法从声明中推断出类名,请添加一个class_name选项。在您的示例中,这不是必需的。如果数据库列不完全映射到Measures 对象的属性,请添加一个:mapping选项,例如:

  composed_of :measures, mapping: %w[database_column_name, object_attribute_name]

如果您想在检索时创建度量或分配新值时执行自定义操作,请分别使用constructorconverter选项,并将它们传递给 Proc。这在此处记录。

注意事项:

  1. 组成的对象是一个VALUE对象。不要改变它的属性,而是分配一个新版本的对象。
  2. 正在采取行动将此功能从 Rails 中移出到 gem 中。到目前为止,删除它的尝试并不成功,它仍在 Rails 4 中。
于 2013-11-08T15:14:57.597 回答
1

我不确定这是否适用于rails 4,但在rails 3中你可以做类似的事情

class Measures
  self.table_name = 'name_of_the_person_table'
  attr_accessible :weight, :height, :other_attrs
end

试试看!

于 2013-09-05T14:31:16.037 回答