2012-04-07 9 views
0

ich wirklich auf diesem Problem steckte, und ich kann nicht einen Weg kommen von ihm finden:Verschachtelte Ressourcen haben viele: durch Beziehung Ausgabe

Ich habe ein Benutzermodell (aufgebaut mit devise).

Ich habe ein Artikelmodell, das eine verschachtelte Ressource für Benutzer ist.

In dem Benutzermodell (user.rb):

# Setup the relations model 
has_many :items, :dependent => :destroy 

In dem Element-Modell (item.rb):

# Setup the relations model 
belong_to :user 

im routes.rb:

resources :users do 
    resources :items 
end 

Auf diese Weise kann ein Benutzer einen Artikel erstellen und besitzen:

ex von Pfad: Benutzer/1/Artikel/1

Jetzt möchte ich, dass der Benutzer ein Element (von ihm erstellt) mit einem anderen Benutzer teilen kann, aber das Eigentum des Elements (nur der Benutzer das erstellte Element kann es zerstören, und nur der Benutzer, der das Element erstellt hat, kann ein Feld des Elements aktualisieren, stattdessen müssen andere Felder (auch vom Benutzer, der das Element empfangen hat) aktualisierbar (bearbeitbar) sein. Mit anderen Worten, ich möchte, dass die Berechtigung für das Element für den Benutzer, der es erstellt hat, und für den Benutzer, der es gerade erhalten hat, unterschiedlich ist.

Um die gemeinsame Nutzung Aktion der Elemente zwischen den Benutzern zu ermöglichen, bauen ich folgende as_many up: durch Beziehung:

ich ein anderes Modell erstellt, die so genannte gemeinsame Nutzung (die die gemeinsame Tabelle zwischen dem Element-Modell und dem Benutzer darstellen Modell):

dann modifizierte ich die user.rb (Benutzermodell) in der folgenden Art und Weise:

# Setup the Item relations model 
has_many :items, :dependent => :destroy # this to set up the item ownership 

#This to set up the has_many :through realtionship 
#(note I am calling a new model shared_items - that really doesn't exist - is an item model) 
has_many :sharings 
has_many :shared_items, :foreign_key => "shared_user_id", :through => :sharings 

accepts_nested_attributes_for :items #This will work for the nested items resource 
accepts_nested_attributes_for :sharings #Do I really need this line?? 

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password, :password_confirmation, 
       :items_attributes, #This will work for the nested items resource 
       :sharings_attributes #Do I really need this line?? 

dann modifizierte ich die item.rb (das Element-Modell) auf folgende Weise:

# Setup the relations model 
belong_to :user 

#this two lines are suppose to connect the two models (item and receiver) using a joint table 
has_many :sharings 
has_many :shared_users, :foreign_key => "shared_item_id", :through => :sharings 

accepts_nested_attributes_for :sharings #Do I really need this line?? 

attr_accessible :user_id, :item_type, :reference_date, :title, 
       :sharings_attributes #Do I really need this line?? 

schrieb ich das sharing.rb (Sharing-Modell - gemeinsame Tabelle) auf folgende Weise:

belongs_to :shared_user, :class_name => "User" 
belongs_to :shared_item, :class_name => "Item" 

attr_accessible :shared_moment_id, :shared_user_id 

Nach, Ich hatte die Tatsache zu berücksichtigen, dass der Empfänger auch ein Benutzer (ein Selbstbezugs - Beziehung), und in meiner App gibt es immer noch ein Freundschaftsmodell (das es einem Benutzer ermöglicht, andere Benutzer zu befreunden, und das funktioniert wie ein Zauber) - aber ich glaube, dass der Joel - Vorschlag helfen kann Verweis auf meinen Freund Tisch).

Mit dieser Stelle kann ich einen erholsamen Controller für Item (ItemsController) erstellen, und fügen Sie eine neue, erstellen, zeigen, zerstören usw. Aktionen, die einen Benutzer (eigentlich den aktuellen Benutzer) ein Element erstellen, zerstören oder aktualisieren es ohne Probleme. (Wie Sie im Artikelmodell sehen können, gibt es den Fremdschlüssel user_id).

Was ich stattdessen tun muss, um einen erholsamen Controller zu erstellen, um das Freigabemodell zu verwalten (um neue freigegebene Elemente zu erstellen und sie anderen Benutzern zuzuteilen)?

Wie nach kann ich die Datenbankwerte abrufen?Ich meine, zum Beispiel:

Benutzer mit ID 3 erstellt fünf neue Elemente (mit Item-ID 1, 2,3,4,5), jetzt er auch entscheiden, einen Teil dieses Elements mit anderen Benutzern zu teilen (Punkt 2 mit Benutzer 6, Element 4,5 mit Benutzer 7,8,9) ???

ich für die gemeinsame Nutzung der verschachtelte Ressource herausziehen, und ich habe jetzt gerade:

Artikel eine verschachtelte Ressource von Benutzer (Benutzer/2/item/5) was Sharing wird ??

Bitte mir jemand helfen ....

Vielen Dank Dinuz

UPDATE konnte ich richtig funktioniert die App lassen, aber als Einzelstücke nur:

Die Benutzer erstellt ein Element. Nachdem er sich entschloss, den Artikel mit einem anderen Benutzer zu teilen (und den sharings Controller - den gemeinsamen Tabellen-Controller) zu verwenden, konnte ich den Datensatz innerhalb der gemeinsamen Tabelle erstellen (die Benutzer-ID und die spezifische Artikel-ID übergeben)

Jetzt möchte ich stattdessen die gesamte Operation in nur einer Aufnahme durchführen:

Der current_user (der Benutzer, der angemeldet ist) erstellt ein Element, und er muss in derselben Form die Möglichkeit haben, es mit anderen zu teilen Benutzer (Array) oder einfach nur für sich selbst.

Ich glaube, dass dieser weitere Schritt, um den Artikel-Controller und den Sharing-Controller zusammen zu schmelzen, und das Gleiche in der neuen Artikelansicht zu tun.

Nun, wie ich fortfahren muss? Wenn jemand ein gutes Tutorial für die has_many vorschlagen kann: Dadurch könnte mein Fall abgedeckt werden (ich muss wirklich verstehen, wie in dieser Situation der Controller und die View aussehen werden), ich denke, dass die Modelassoziation gut eingerichtet ist, aber ich kann nicht wirklich herausfinden, wie mit dem Controller und der Ansicht fortfahren.

Antwort

1

Sie können eine benutzerdefinierte Validierung wie folgt verwenden:

class User < ActiveRecord::Base 
    validate :sharing_with_friends_only 

    def sharing_with_friends_only 
    (receivers - friends).empty? 
    end 
end 

Wie Sie erwähnen, ist der einfache Weg zu un-Nest die Ressourcen.

Dadurch werden auch Ihre APIs sauberer.

+0

Hallo Joel, deine Idee ist eine gute, aber ich muss besser herausfinden, wie ich die Assoziationen in den Modellen einrichten muss – Dinuz

+0

Ich werde meinen Beitrag bearbeiten, um die Frage zu aktualisieren. – Dinuz

+0

Nun, ich habe das Problem gelöst .... Danke nochmal Joel !!! – Dinuz