多态关联不适用于ActiveHash

时间:2019-04-07 21:13:56

标签: ruby-on-rails ruby activerecord

我有一个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似乎可以正常工作。

1 个答案:

答案 0 :(得分:1)

请参阅文档:https://github.com/zilkey/active_hash/issues/151

**

  

ActiveHash不支持 arel 行为。

**

Arel 是Ruby的SQL AST(类似于抽象语法树)管理器。它使我们能够以语义,可重用的方式编写复杂的SQL查询。 Arel是“框架框架”;它旨在通过数据库兼容性优化对象和集合建模。 活动记录基于Arel构建。

请参阅文档:https://www.rubydoc.info/gems/honkster-active_hash/0.7.3

即使在此官方文档中,它也没有像这样解释任何地方:

has_many :people, as: :placeable

只需解释

belongs_to :placeable, polymorphic: true