Как поделиться моделью с другими моделями базы данных в рельсах 3 лучше, чем Полиморфные Ассоциации - PullRequest
1 голос
/ 22 января 2011

Скажем, у нас есть:

class ProductProperties < ActiveRecord::Base
 belongs_to :sellable, :polymorphic => true, :dependent => :destroy
end

class Tee < ActiveRecord::Base
 has_one :product_properties, :as => :sellable, :autosave => true
end

class Pen < ActiveRecord::Base
 has_one :product_properties, :as => :sellable, :autosave => true
end

Мы можем обратиться к свойствам продукта как: @ Tee.productProperties.property или @ Pen.productProperties.property

Есть ли способ получить доступ просто к @ Tee.property и @ Pen.property?

Это значительно упростит задачу, поскольку у Tee и Pen есть свои атрибуты (например, @ Pen.ownProperty)

Пока мои исследования привели меня к этому плагину: https://github.com/brunofrank/class-table-inheritance. Кто-нибудь использовал это, и использует ли это хорошую идею (мое внутреннее чувство, что это будет ломаться при каждом новом выпуске рельсов)?

Спасибо!

1 Ответ

1 голос
/ 05 февраля 2011

Один из обходных путей - определить метод, который предоставит вам прямой доступ к унаследованным свойствам:

class Pen < ActiveRecord::Base
  def some_property
    product_properties.some_property
  end
end

# These calls are equivalent
@pen.some_property
@pen.product_properties.some_property

Если у вас много свойств, вы, вероятно, захотите сделать это динамически:*

class Pen < ActiveRecord::Base
  [ :property1, :property2, :property3 ].each do |property|
    define_method(:property) do
      product_properties.some_property
    end
  end
end

Однако, это звучит как главный кандидат на Наследование одной таблицы .Вы создаете родительскую модель (Product), от которой наследуются ваши дочерние модели (Pen, Tee и т. Д.).У них есть все свойства Product, а также их собственные специфические свойства.

Просмотрите интерактивное руководство по обучению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...