2016-04-14 27 views
1

Ich habe einen Fall, in dem jeder Benutzer viele Elemente hat und jedes Element hat viele Benutzer. Allerdings möchte ich auch jedem Benutzer ein primäres Element zuweisen. Ich kann nicht herausfinden, was die beste architektonische Entscheidung ist, um dies zu erreichen. Am Ende möchte ich nennen können:Ruby on Rails mehrere Assoziationen mit dem gleichen Modell

User.primary_item 
+2

Ich denke, Ihre Verknüpfung vor der Bearbeitung könnte funktionieren. ': foreign_key' wird von' has_one' unterstützt. http://guides.rubyonrails.org/association_basics.html#options-for-has-one Das heißt, wenn ein Element nur einen Besitzer haben kann. Wenn mehrere Personen dasselbe Element wie ihr primäres Element haben können, sollte die Assoziation vielleicht in die andere Richtung gehen. –

+0

Mit has_one würde es aber nicht für den Fremdschlüssel in der Elementtabelle und nicht in der Benutzertabelle suchen? Würde es besser sein? – rantingsonrails

+1

Ja, wenn die Beziehung ist, dass viele Benutzer das gleiche primäre Element haben können, aber ein Benutzer nur ein solches primäres Element haben kann, können Sie eine 'primary_item_id' für Benutzer und ein' gehört_to' für Benutzer haben. –

Antwort

2

Dieses wie ein has_many_through Beziehung klingt.

class User 
    has_many :owned_items 
    has_many :items, through :owned_items 
end 

class Item 
    has_many :owned_items 
    has_many :users, through :owned_items 
end 

class OwnedItem 
    belongs_to :items 
    belongs_to :users 
end 

Anstatt für den primary_item eine separate Beziehung hat, können Sie ein primäres Attribut auf owned_item haben.

+1

Das würde eine neue Tabelle erfordern? Wäre das Folgende einfacher? gehört: primary_item,: class_name => "Element",: foreign_key => "primary_item_id" – rantingsonrails

+0

@rantsingsonrails, ein ': fremder_Schlüssel' fügt sich gegen Rails-Konventionen. Ich finde es viel einfacher, eine neue Tabelle hinzuzufügen, als die Konventionen von Rails zu bekämpfen. – John

+1

Ihre Frage besagt, dass "jeder Benutzer viele Elemente hat und jedes Element viele Benutzer hat". Es ist entweder eine has_many_through oder eine has_many_and_belongs_to Beziehung. Ich denke, wenn Sie Ihre App entwickeln, werden Sie feststellen, dass ein has_many_through Ihnen viele Vorteile bietet. – margo

0

Basierend auf den gegebenen Informationen, würde ich sagen, eine has_many through: Zuordnung für beide Modelle einrichten. Fügen Sie im Modell User eine Spalte für primary_item_id hinzu, und fügen Sie dann scope zum User Modell mit dem Namen primary_item hinzu, das das primäre Element dieses Benutzers abruft. Beachten Sie, dass eine Zuordnung has_many through: erfordert, dass Sie auch eine verknüpfte Join-Tabelle UserItems erstellen.

class User < ActiveRecord::Base 
    has_many :user_items 
    has_many :items, through: :user_items 
    scope :primary_item, -> { Item.find(self.primary_item_id) } 
end 

class UserItem < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :item 
end 

class Item < ActiveRecord::Base 
    has_many :user_items 
    has_many :users, through: :user_items 
end 

dass die relevanten Informationen für die ActiveRecord Modelle ist. Sie müssen außerdem Migrationen ausführen, um die Tabelle UserItems zu erstellen und die Spalte primary_item_id zur Tabelle Users hinzuzufügen. Beachten Sie, dass Sie :foreign_key nirgendwo verwenden.

+0

Er will viele Gegenstände und ein Benutzerelement. Ich denke, alles, was Sie brauchen, ist ein Feld in der Tabelle Users, das auf die Items-Tabelle zeigt. Keine Notwendigkeit für einen anderen Tisch. – Kalman

+0

@Kalman, du liegst falsch.Wie aus seiner Frage hervorgeht: "Ich habe einen Fall, in dem jeder Benutzer viele Gegenstände hat und jeder Gegenstand viele Benutzer hat." * Es ist eine Beziehung von vielen zu vielen. Er ** möchte auch jedem Benutzer einen Hauptartikel zuweisen. * – John

+0

Das stimmt. Benutzer und Element sind ein Viele-zu-Viele-System. Benutzer ALSO hat eine Eins zu seinem Hauptartikel. – Kalman