2016-08-17 2 views
0

Also mache ich eine App, die Bücher, Artikel und dergleichen rezensiert.Verknüpfen vieler bestehender Modelle mit einem neuen. Ruby on Rails

Ich habe das Rückgrat der App erstellt, indem ich Modelle, Ansichten, Controller usw. für Piece (das Buch oder den Artikel), den Abschnitt (selbsterklärend), Subsection und Subsubsection erstellt habe.

Ich möchte ein neues Modell in den Mix einfügen, ein "Links" -Modell (das nur ein Link zu einer anderen Quelle oder Website sein wird). Mein Problem ist, dass ich nicht weiß, wie ich all meine zuvor genannten Modelle "Links" machen kann. Ich möchte, dass jedes der obigen Modelle Zugriff und CRUD-Fähigkeiten zu ihren "Links" hat, aber bis jetzt habe ich nur über has_many oder has_and_belongs_to_many gelesen.

Soweit ich verstehe, beziehen sich diese Arten von Beziehungen nur EIN Modell auf ein anderes Modell, selbst wenn Piece viele Abschnitte haben könnte, bezieht es sich nur auf diese beiden Modelle.

Ich denke, das Links-Modell müsste eine obligatorische piece_id haben, aber dann optionale IDs wie: section_id, subsection_id, abhängig davon, wo der Link war. Also wenn ich in Kapitel 3 meines ersten Buchs einen Link hinzufügen möchte, hätte es eine obligatorische piece_id = 1 und dann eine section_id = 3, aber dann keine subsection_id oder subsubsection_id.

Also, wie gehe ich bei der Erstellung eines Modells, so dass es zu mehreren anderen Modellen gehört? Oder ist das überhaupt möglich?

https://github.com/kingdavidek/StuddyBuddy

+1

So kann es zu einem der anderen Modelle gehören? Oder gehören sie vielen auf einmal? –

+0

Die Idee ist, dass es zu einem gehören würde, aber je nachdem welcher, könnte es zu vielen gehören. Es gibt eine verschachtelte Beziehung zwischen ** Stück >> Abschnitt >> Teilabschnitt >> Teilabschnitt **. Wenn ich also einen neuen ** Link ** in einem ** Teilabschnitt ** erstellen wollte, würde dieser Teil ** Teilabschnitt ** angehören. , aber auch zu ** Section ** und ** Piece ** wegen der verschachtelten Beziehung. – Kingdavidek

+0

Sie können has_many durch Beziehung verwenden. Diesen Link prüfen http://stackoverflow.com/questions/31358679/is-a-has-my-through-relationship-possible-with-4-models-in-rails – abhi110892

Antwort

0

Dies ist ein ziemlich guter Anwendungsfall für polymorphic Assoziationen. Der Einfachheit halber können mit einer Eins-zu-Beziehung beginnen:

class Link < ActiveRecord::Base 
    belongs_to :linkable, polymorphic: true 
end 

class Piece < ActiveRecord::Base 
    has_many :links, as: :linkable 
end 

class Section < ActiveRecord::Base 
    has_many :links, as: :linkable 
end 

Tabelle linkable_id haben hier die links (int) und linkable_type (string) Spalten. Eine wichtige Sache, die hier zu beachten ist, ist, dass linkable_id kein echter Fremdschlüssel aus Sicht von RBDMS ist. Stattdessen löst ActiveRecord auf, auf welche Tabelle die Beziehung zeigt, wenn sie die Beziehung lädt.

Wenn wir die Duplizierung schneiden wollen, können wir ein Modul erstellen, das das gewünschte Verhalten enthält. Durch die Verwendung von ActiveSupport::Concern wird ein Großteil des für die Erstellung eines solchen Moduls erforderlichen Standardcodes entfernt.

class Link < ActiveRecord::Base 
    belongs_to :linkable, polymorphic: true 
end 

# app/models/concerns/linkable.rb 
module Linkable 
    extend ActiveSupport::Concern 

    included do 
    has_many :links, as: :linkable 
    end 
end 

class Piece < ActiveRecord::Base 
    include Linkable 
end 

class Section < ActiveRecord::Base 
    include Linkable 
end 

Also, wie würden wir eine polymorpic viele zu viele Beziehung machen?

class Link < ActiveRecord::Base 
    has_many :linkings 
end 

# this is the join model which contains the associations between 
# Links and the "linkable" models 
class Linking < ActiveRecord::Base 
    belongs_to :link 
    belongs_to :linkable, polymorphic: true 
end 

# app/models/concerns/linkable.rb 
module Linkable 
    extend ActiveSupport::Concern 

    included do 
    has_many :links, through: :linkings, as: :linkable 
    end 
end 

class Piece < ActiveRecord::Base 
    include Linkable 
end 

class Section < ActiveRecord::Base 
    include Linkable 
end 

Auf einer seitlichen Anmerkung - eine bessere Art und Weise eine Hierarchie aufbauen zwischen den Abschnitten einen einzigen Abschnitt Modell und give it a self joining relationship zu verwenden wäre.

class Section < ActiveRecord::Base 
    belongs_to :parent, class_name: 'Section' 
    has_many :children, class_name: 'Section', 
         foreign_key: 'parent_id' 
end 
+0

Vielen Dank für Ihre Antwort das scheint genau das zu sein, was ich brauche, obwohl ich es nicht alles komplett verstehe aber ich werde den Jargon nachschlagen, um es zu verstehen. Für die selbstverbindende Beziehungsdinge, beziehst du dich auf die verschachtelten Modelle Piece >> Section >> Subsection etc. Würdest du deinen Weg so gestalten, dass du im Wesentlichen Abschnitt >> Abschnitt >> Abschnitt >> ad infinitum gehen könntest? – Kingdavidek

+0

"Würdest du es so machen, dass du im Wesentlichen Abschnitt >> Abschnitt >> Abschnitt >> ad infinitum gehen könntest?" - ja genau. Ich würde wirklich empfehlen, durch die Schienen zu lesen, da das ziemlich fortgeschrittene Zeug ist. – max

1

Ok, klingt es wie im Wesentlichen wollen Sie ein polymorphic association

class Link 
    belongs_to :linkable, polymorphic: true 
end 

class Piece 
    has_many :links, as: :linkable 
end 

Verbindung würde linkable_id Integer-Spalte und linkable_type String-Spalte müssen. Sie können es dann auf die gleiche Art und Weise verwenden, wie ein gewöhnlicher has_many-belongs_to Verein

, wenn ich einen neuen Link in einem Unterabschnitt schaffen wollte, wäre es zu Unterabschnitt gehören, sondern auch Abschnitt und Stück wegen der verschachtelt Beziehung

Dieses Bit Schiene kann mit nicht helfen, müssen Sie Ihre eigene Methode schreiben, um all Glieder in der Kette der Elemente zu finden.

+0

Vielen Dank für Ihre Hilfe, ich nehme an, es wäre zu schwierig für die verschachtelte Beziehung Sache, es zum Beispiel mit einem Unterabschnitt verknüpft zu haben, und dann nur die Eltern-IDs den ganzen Weg bis den Baum zu finden? – Kingdavidek

+0

@Kingdavidek Wenn Sie sich die Ruby-Edelsteine ​​für Baumstrukturen wie Schließbaum oder Vorfahren anschauen, haben viele von ihnen diese Funktionseingabe –