has_and_belongs_to_many STI,限制为类型唯一

时间:2014-12-23 08:56:01

标签: ruby-on-rails sti

我正在使用具有has_and_belongs_to_many关系的STI模型。 所以我User有许多不同类型的Templates,例如MainTemplate < Template; NotSoMainTemplate < Template;等等 有没有办法限制每个用户只有一个MainTemplate而只有一个NotSoMainTemplate,以此类推所有类型?

2 个答案:

答案 0 :(得分:3)

让我重申一下我所理解的问题陈述。

您希望User每个模板的最多一种种类。即。

  • 1 MainTemplate,1 NotSoMainTemplate等
  • 不需要Template(父表)的直接关系
  • 每个模板可由多个用户使用

基于上述假设,我建议您执行以下操作:

  1. 删除habtmUser
  2. 之间的现有Template关联
  3. 添加迁移以将main_template_idnot_so_main_template_id添加到User
  4. 添加以下关联:

    class MainTemplate < Template
        has_many :users
    end
    
    class NotSoMainTemplate < Templete
        has_many :users
    end
    
    class class User < ActiveRecord::Base
        belongs_to :main_template
        belongs_to :not_so_main_template
    end
    

答案 1 :(得分:0)

由于您已经在使用STI,因此可以尝试has_one

class Template < ActiveRecord::Base
  has_many :users, through: template_choice
  ...
end

class MainTemplate < Template
  ...
end

class TemplateChoice < ActiveRecord::Base
  belongs_to :template_choice
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one  :main_template, through: :template_choice
  has_one  :not_so_main_template, through: :template_choice
  ...
end