我正在开发一个流动的民主应用程序。我的数据模型是:
用户和组织都是选民。Voter 有一个有序的代表团列表。一个代表团由一组标签和一个有序的选民(代表)列表组成。
在确定哪个 Voter 充当代理时,使用具有匹配标签的第一个代表,然后是列表中对问题投票的第一个代表。
要创建委托的有序列表,我可以简单地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
,因此它会同时更新用户和组织。既然订单被保留了,这有关系吗?在进行重新排序和插入时,这可能会成为一个问题。