我正在研究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
上,因此它将更新用户和组织。由于订单得以保留,这有关系吗?在进行重新排序和插入时,它可能会成为一个问题。
答案 0 :(得分:0)
最终,这个结构被单表继承取代,后者只有一组标识符,因此acts_as_list
可以正常工作。