0

我正在开发一个流动的民主应用程序。我的数据模型是:

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

在确定哪个 Voter 充当代理时,使用具有匹配标签的第一个代表,然后是列表中对问题投票的第一个代表。

要创建委托的有序列表,我可以简单地position在模型中添加一个字段Delegationacts_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,因此它会同时更新用户和组织。既然订单被保留了,这有关系吗?在进行重新排序和插入时,这可能会成为一个问题。

4

1 回答 1

0

最终,这种结构被单表继承所取代,单表继承具有一组标识符,因此acts_as_list可以工作。

于 2014-09-10T14:26:49.777 回答