У меня есть класс ActiveHash, который я хотел бы использовать в полиморфной ассоциации:
class Person < ActiveRecord::Base
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :placeable, polymorphic: true
end
class Country < ActiveHash::Base
include ActiveHash::Associations
has_many :people, as: :placeable
self.data = [
{ id: 1, name: 'US' },
{ id: 2, name: 'Canada' }
]
end
При установке полиморфной ассоциации она сохраняется в базе данных, устанавливая для полиморфного типа значение ActiveHash::Base
. При доступе к нему позже я получаю ошибку undefined method 'arel_table'
.
person = Person.create
person.placeable = Country.last
person.save
person
=> #<Person id: 1, placeable_id: 2, placeable_type: "ActiveHash::Base">
person.placeable
NoMethodError: undefined method `arel_table' for ActiveHash::Base:Class
from (irb):2
Я также пытался установить полиморфный тип на Country
, но получаю ту же ошибку для класса Country.
Неполиморфный belongs_to
работает нормально.
См. документ: https://github.com/zilkey/active_hash/issues/151
**
ActiveHash does not support arel behaviour.
**
Арел — это менеджер SQL AST (аналог абстрактного синтаксического дерева) для Ruby. Это позволяет нам писать сложные SQL-запросы в семантической, многократно используемой форме. Arel — это «фреймворк»; он предназначен для оптимизации моделирования объектов и коллекций по сравнению с совместимостью с базами данных. Active Record построен поверх Arel.
см. документ: https://www.rubydoc.info/gems/honkster-active_hash/0.7.3
Даже в этом официальном документе это нигде не объясняется:
has_many :people, as: :placeable
Просто объясни
belongs_to :placeable, polymorphic: true
Вы уверены, что это вообще поддерживается этим гемом ActiveHash? Звучит так, как будто это не так.