我可以使用具有多态关联的act-as-list吗?

时间:2014-08-03 05:11:15

标签: ruby-on-rails acts-as-list

我正在研究liquid democracy app。我的数据模型是:

用户和组织都是选民。选民有一个有序的代表团名单。一个代表团由一组标签和一个有序的选民(代表)列表组成。

在确定哪个选民作为代理人时,使用具有匹配标签的第一个代表团,然后使用列表中第一个代表投票的代表。

要创建有序的授权列表,我只需向position模型添加Delegation字段即可。然后可以使用acts_as_list来管理订单。

我不确定的是如何构建代表列表。看起来数据库列应该是:

  • delegation_id
  • delegate_type
  • delegate_id
  • position

我当前的刺伤是:

class User < ActiveRecord::Base
  has_and_belongs_to_many :organizations
  has_many :delegations, as: :voter
  acts_as_tagger
  acts_as_voter
end

class Organization < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :delegations, as: :voter
  acts_as_tagger
  acts_as_voter
end

class Delegation < ActiveRecord::Base
  belongs_to :voter, polymorphic: true
  has_many :tags
  has_and_belongs_to_many :delegation_entries, -> { order("position ASC") }
  acts_as_list scope: :voter
end

class DelegationEntry < ActiveRecord::Base
  belongs_to :delegation
  acts_as_list scope: :delegation
end

当我从控制台执行Organization.first.delegations << Delegation.create时,我看到:

(0.4ms)  BEGIN
Delegation Load (1.0ms)  SELECT  "delegations".* FROM "delegations"  WHERE ("delegations"."voter_id" IS NULL AND position > 1)  ORDER BY delegations.position ASC LIMIT 1
SQL (0.7ms)  UPDATE "delegations" SET position = (position + 1) WHERE ("delegations"."voter_id" = 1 AND position >= 1)

因此,acts_as_list显然不能处理多态关联。增量仅在id上,因此它将更新用户和组织。由于订单得以保留,这有关系吗?在进行重新排序和插入时,它可能会成为一个问题。

1 个答案:

答案 0 :(得分:0)

最终,这个结构被单表继承取代,后者只有一组标识符,因此acts_as_list可以正常工作。