ActiveRecord组合

时间:2013-09-05 14:20:53

标签: activerecord ruby-on-rails-4

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

示例:

class Person
  attr_accessible :name, :age
end

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

如何将Measures合并到Person,将Measure数据存储在persons表中?

2 个答案:

答案 0 :(得分:3)

ActiveRecord包含一个特定功能。

class Person
  composed_of :measures
end

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

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

如果要在检索时创建Measures时或在分配新值时执行自定义操作,请分别使用constructorconverter选项,并将它们传递给Proc。记录在案here

注意事项:

  1. 由object组成的是VALUE对象。不要改变它 属性,而是分配对象的新版本。
  2. 正在采取行动将此功能从Rails移动到宝石中。该 试图删除它到目前为止还没有成功,它仍然存在 Rails 4。

答案 1 :(得分:1)

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

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

试一试!