ruby on rails association Wie man eine Art "gehört_to: through" einrichtet, ohne eine direkte orders_to einzurichten?




rails generate model (3)

Verwenden Sie den Delegaten in der Modellklasse.

class Team < ActiveRecord::Base
  belongs_to :division
  has_many :players

  delegate :league, to: :division
end

Referenz: http://api.rubyonrails.org/classes/Module.html#method-i-delegate

Ich weiß, dass das "gehört: durch" nicht gültig ist, es ist nur mein Versuch, auszudrücken, was ich erreichen möchte, ertrage mich nur für eine Sekunde ...

Das habe ich bekommen:

class League
  has_many :divisions
end

class Division
  belongs_to :league
  has_many :teams
end

class Team
  belongs_to :division
  has_many :players
end

class Player
  belongs_to :team
end

Um nun eine "Baseball-Karte" zu erstellen, brauche ich:

name
team.name
team.division.name
team.division.league.name

Also, gibt es eine Möglichkeit, ein "gehört_zu: durch" einzurichten, um direkt auf "division.name" von "players_controller" ohne das "Team" zuzugreifen. Präfix ?? Ich muss auf viele Spalten von 'player' bis 'division' zugreifen, also nach einem Weg suchen, 'direkten' Zugriff auf diese Spalten zu bekommen.

Eine Möglichkeit besteht darin, eine 'division_id'-Spalte in die' players'-Tabelle aufzunehmen, aber mir wurde gesagt, dass sie das relationale Datenmodell brechen würde, da es Inkonsistenzen ermöglichen würde, wenn die Datenauswahlfunktionalität nicht korrekt gehandhabt würde (z Spieler A ist in Team A, das in Abteilung A ist, aber Spieler A hat die Spalte division_id in Abteilung B).

Ist es möglich einen "symbolischen Link" zu erstellen, zB bezieht sich "division" jetzt auf "team.division" und "league" bezieht sich nun auf "team.division.league" ??

Oder, ist die einzige echte Option, den vollen Pfad jedes Mal zu verwenden ??

Hoffe jemand kann helfen.

Br, Jonas


Answer #1

Sie können in Ihrem Player-Modell eine Hilfsmethode definieren:

def division
  team.division
end

def league
  team.division.league
end

Dies bezieht sich natürlich nur auf die Lesbarkeit Ihres Codes und hat keinen Einfluss auf die Form der betroffenen Datenbankabfragen. Wenn Ihre Anweisung mehrere SQL-Abfragen generiert, Sie aber nur eine Abfrage wünschen, .include Option .include hier: Rails Guides - Active Record Query Interface


Answer #2

Sie können es versuchen

    class Player
      belongs_to :team
      has_one :division, :through => :team
    end




activerecord