2013-09-05 2 views
1

Следуя принципу единой ответственности, я хочу поместить некоторые атрибуты и указать в одном отдельном классе, но я хочу, чтобы он находился в одной таблице.ActiveRecord Composition

Пример:

class Person 
    attr_accessible :name, :age 
end 

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

Как я могу композитный Measures в Person, хранение данных Measure в таблице persons?

ответ

2

ActiveRecord содержит определенную функцию для этого.

class Person 
    composed_of :measures 
end 

Если имя класса не может быть выведено из декларации, добавьте class_name вариант. Это не обязательно в вашем примере. Если столбцы базы данных не отображаются точно атрибутах мер возражают, добавьте :mapping вариант, например:

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

Если вы хотите сделать что-то обычай, когда меры создается после извлечения, или когда новое значение , используйте параметры constructor и converter, соответственно, и передайте им Proc. Это задокументировано here.

Предостережения:

  1. Сформированное объекта является значение объекта. Не изменяйте атрибуты , вместо этого назначьте новую версию объекта.
  2. Для перемещения этой функции из Rails в драгоценный камень есть движение. попытка удалить его не удалось до сих пор, и он все еще находится в Rails 4.
+0

Nice и новое дополнение к моему обучению в Rails. –

1

Я не уверен, если это работает с рельсами 4, но в рельсах 3 вы можете сделать что-то вроде

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

Дайте ему попробовать!