2016-07-01 52 views
0

我有User模型和Dispute模型。争议包含涉及用户的列表,以及“原告”和“被告”。我希望能够做到这一点:制作多态ActiveRecord关联的正确方法

Dispute.first.users 
#[<User 1>, <User 2>] 

Dispute.first.accuser 
#<User 1> 

Dispute.first.defendant 
#<User 2> 

因此,这里是我的模型:

class Dispute < ApplicationRecord 
    has_and_belongs_to_many :users 
    belongs_to :accuser, polymorphic: true 
    belongs_to :defendant, polymorphic: true 
end 
class User < ApplicationRecord 
    has_and_belongs_to_many :disputes 

    has_one :user, as: :accuser 
    has_one :user, as: :defendant 
end 

迁移:

class CreateDisputes < ActiveRecord::Migration[5.0] 
    def change 
    create_table :disputes do |t| 
     t.references :accuser, polymorphic: true, index: true 
     t.references :defendant, polymorphic: true, index: true 
    end 
    end 
end 
class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.timestamps 
    end 
    end 
end 

这给了我我想要的行为,除了Dispute.new.save错误,除非我将用户分配到dispute.accuserdispute.defendant

它看起来也错了:不应用户一个争议的原告/被告?我似乎无法让它工作。

回答

4

我可以推荐一些更简单的东西吗?我希望我说得对。

型号:

class Dispute < ApplicationRecord 
    belongs_to :accuser, class_name: 'user' 
    belongs_to :defendant, class_name: 'user' 

    def users 
    [accuser, defendant] 
    end 

end 

class User < ApplicationRecord 
end 

迁移:

class CreateDisputes < ActiveRecord::Migration[5.0] 
    def change 
    create_table :disputes do |t| 
     t.references :accuser, index: true, references: :user 
     t.references :defendant, index: true, references: :user 
    end 
    end 
end 
+0

嘿,工程和更有意义,谢谢。除非原告人和被告人都存在,否则“争议”仍然存在问题。 (“原告必须存在”和“被告必须存在”的错误)。我想了解为什么 –

+0

'belongs_to:accuser,可选:true' 'belongs_to:被告,可选:true' – fabriciofreitag