2016-07-01 54 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