Domanda

Ho i seguenti tre modelli: l'utente, progetto, e assegnazione

.

A has_many utente progetti attraverso un incarico. Tuttavia, in realtà ha Assegnazione due chiavi esterne che si riferiscono ad un utente:. user_id (che rappresentano l'utente che è stato assegnato al progetto) e completer_id (che rappresentano l'utente che ha completato il progetto)

Spesso, user_id e completer_id sarà lo stesso (se l'utente che è stato assegnato al progetto lo completa). Tuttavia, se un altro utente lo completa, user_id e completer_id sarà diverso.

Nel mio modello User, ho il seguente:

class User < ActiveRecord::Base
  has_many   :assignments
  has_many   :incomplete_assignments, :class_name => 'Assignment',
    :conditions  => 'completer_id IS NULL'
  has_many   :completed_assignments, :class_name => 'Assignment',
    :foreign_key => 'completer_id'

  # this is the important one
  has_many   :incomplete_projects,
    :through     => :assignments,
    :source      => :project,
    :conditions  => 'completer_id IS NULL'
end

Vorrei fare un'altra associazione, chiamata :completed_projects, che utilizza completer_id come la chiave esterna per l'utente nel modello :through, piuttosto che :user_id. E 'possibile fare questo?

E, per inciso, sono consapevole della possibilità :foreign_key. Tuttavia, questa opzione viene ignorata quando si utilizza :through, quindi mi piacerebbe sapere se c'è un modo per farlo senza di essa.

Infine, vorrei ricordare che io sono aperto ad altri disegni, se non può essere fatto in questo modo e qualcuno può pensare a un modo migliore.

È stato utile?

Soluzione

È sempre possibile utilizzare SQL per la selezione se ActiveRecord non può facilmente esprimere la relazione fuori dalla scatola:

has_many :completed_projects,
:class_name => "Project",
:finder_sql => 'SELECT p.* FROM projects p ' +
  'INNER JOIN assignments a ON p.id=a.project_id ' +
  'INNER JOIN users u on u.id=a.completer_id ' +
  'WHERE u.id=#{id}'

Altri suggerimenti

Avete altri meta dati della tabella assegnazioni?

Se non vorrei solo usare HABTM e aggiungere il completer_id al tavolo progetti, invece, ha senso di vivere comunque.

Se avete bisogno / desidera utilizzare has_many: attraverso si poteva guardare utilizzando named_scopes (versione Rails permettendo) in modo che si possa dire user.projects.completed e user.projects.incomplete

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top