2011-01-18 10 views
5

Ho un modello di entità e voglio visualizzare le connessioni tra le entità. Ad esempio, l'Entità 1 è collegata all'entità 2.Modelli autoreferenziali in Rails 3

Il mio pensiero, al momento, è quello di creare un modello di join tra i due chiamati Connection e farlo funzionare come una tabella di join delle guide tradizionali. Tranne che le colonne sono entity_one_id e entity_two_id, quindi stabilisce una relazione molti-a-molti tra Entità e Connessione.

Questo sembra un modo davvero non elegante per farlo. Mi stavo chiedendo se qualcuno avesse qualche idea migliore? Forse qualcosa di più rotaie che non vedo?

risposta

8

Questo è il modo più comune per farlo. Se un'entità è sempre connessa solo a un altro modello, è possibile utilizzare una lista collegata, una struttura ad albero.

Check out Ryan Bates' Railscast on self-joining models. Si tratta di un sistema di social-network-like, ma ha ancora i principi di cui ha bisogno e fornisce un ottimo punto di partenza

1

È possibile utilizzare questa implementazione:

class User < ActiveRecord::Base 
    has_many :friends, :through => :friendships, :conditions => "status = 'accepted'" 
    has_many :requested_friends, :through => :friendships, :source => :friend, :conditions => "status = 'requested'", :order => :created_at 
    has_many :pending_friends, :through => :friendships, :source => :friend, :conditions => "status = 'pending'", :order => :created_at 
    has_many :friendships, :dependent => :destroy 
end 


class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => "User" 
end 
+3

l'attuazione hai rubato Railscast di Ryan? :) – sethvargo

+3

Infatti non mi ricordo dove l'ho preso, ma hai decisamente ragione :) – apneadiving