3 Stimmen

Hilfe beim Erstellen eines Modells in Rails

class Profile
  has_many :projects, :through => "teamss"
  has_many :teams, :foreign_key => "member_id"
  has_many :own_projects, :class_name => "Project", :foreign_key => :profile_id
  has_many :own_teams, :through => :own_projects, :source => :teams
end

class Project
  belongs_to :profile, :class_name => "Profile"
  has_many :teams
  has_many :members, :class_name => "Profile", :through => "teams", :foreign_key => "member_id"
end

class Team
  belongs_to :member, :class_name => 'Profile'
  belongs_to :project
end

Ich muss ein Modell Evaluation erstellen. Was ich machen möchte, ist einen Link auf der Seite project#view für jedes Mitglied des Projekts zu generieren, einschließlich des Eigentümers, um eine Evaluation vorzunehmen. Die Person wird auf den Link klicken und die mit diesem Link verbundene Person bewerten. Der Besitzer des Projekts wird alle Mitglieder bewerten, und alle Mitglieder werden den Besitzer bewerten.

Ich habe das Modell Evaluation wie folgt definiert, aber ich denke, ich habe etwas übersehen:

class Evaluations < ActiveRecord::Base
  belongs_to :evaluated, :class_name => 'Profile', :foreign_key => "evaluated_id"
  belongs_to: :profile, :class_name => 'Profile', :foreign_key => "profile_id"
end

Denken Sie daran, dass die Tabelle Evaluation eine Vielzahl von Attributen haben wird, daher werde ich nicht mit has_many_and_belongs_to_many arbeiten.

Wie kann ich dieses Modell erstellen, um das zu tun, was ich möchte, und alle erforderlichen Informationen über die Seite project#show zugreifen zu können?

Danke!

Bearbeitet

Vorgenommene Änderungen:

class Profile
  has_many :evaluations, :dependent => :destroy, :foreign_key => :evaluation_id
  has_many :evaluators, :through => :evaluations, :foreign_key => :profile_id
end

class Project
  has_many :evaluations,:foreign_key => "project_id"
end

class Evaluations < ActiveRecord::Base
  belongs_to :evaluated, :class_name => 'Profile', :foreign_key => "evaluated_id"
  belongs_to: :profile, :class_name => 'Profile', :foreign_key => "profile_id"
  belongs_to: :project, :class_name => 'Project', :foreign_key => "project_id"

0voto

Yardboy Punkte 2767

Sie haben Ihre Team- und Profil (Mitglied)-Zuordnungen etwas durcheinander gebracht. Ein Team hat viele Profile (Mitglieder), und ein Profil (Mitglied) gehört zu einem Team. Darüber hinaus machen Sie die Dinge vielleicht nur komplizierter. Ich frage mich, warum Sie das Profilmodell nicht einfach als "Mitglied" bezeichnen und die Dinge so viel einfacher halten würden?

Das gesagt habend, Sie haben ziemlich komplexe Zuordnungen. Ich würde Ihnen dringend empfehlen, das Dokumentation zu ActiveRecord-Zuordnungen sorgfältig zu lesen, um ein festes Verständnis darüber zu erhalten, wie diese Dinge funktionieren, insbesondere wie Primär- und Fremdschlüssel automatisch bestimmt werden.

Ich denke, dass das Folgende Sie dahin bringen wird, was Sie wollen.

class Team
  has_and_belongs_to_many :members,
    :class_name => "Profile"
  belongs_to :project
  belongs_to :team_leader,
    :class_name => "Profile"
end

class Profile
  has_and_belongs_to_many :teams
  has_many :projects,
    :through => :teams
  has_many :owned_projects,
    :class_name => "Project",
    :foreign_key => "owner_id"
  has_many :owned_teams,
    :class_name => "Team",
    :foreign_key => "team_leader_id"
  has_many :evaluations
  has_many :evaluations_given,
    :class_name => "Evaluation",
    :foreign_key => "evaluator_id"
end

class Project
  has_many :teams
  belongs_to :owner,
    :class_name => "Profile"
  has_many :members,
    :through => :teams
  has_many :evaluations
end

class Evaluation
  belongs_to :profile
  belongs_to :evaluator,
    :class_name => "Profile",
    :foreign_key => "evaluator_id"
  belongs_to :project
end

Zur Unterstützung dieser Modelldefinitionen sollten folgende Tabellen/Schlüssel vorhanden sein:

evaluation
  id
  profile_id
  evaluator_id
  project_id

teams
  id
  project_id
  team_leader_id

profiles
  id

project
  id
  owner_id

profiles_teams
  profile_id
  team_id

Damit sollten Sie auf Sammlungen/Objekte zugreifen können, die Sie benötigen, um Ihre Verknüpfungen richtig zu bekommen, wie zum Beispiel:

  • project.members

    project.owner

    project.teams

    team.project

    profile.projects

    profile.owned_projects

    profile.teams

    team.members

    team.leader

    project.evaluations

    profile.evaluations

    evaluation.evaluator

    profile.evaluations_given

Beachten Sie auch, dass Ihre verschachtelten Ressourcen genauso komplex sein werden, wenn Sie bei einem RESTful Framework bleiben möchten. Informieren Sie sich!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X