2016-06-08 14 views
0

So habe ich ein System von Produkten und einen Einkaufswagen in meiner App Rails gebaut. Das Ziel, das ich habe, besteht darin, dem Benutzermodell IDs der gespeicherten Produkte aus einem Einkaufswagen hinzuzufügen. Auf meiner Warenkorb-Seite gibt es eine Liste aller hinzugefügten Produkte in einem Einkaufswagen und ich möchte eine Speichern-Schaltfläche hinzufügen, die diese Produkte nach ihren IDs in den Spalten in der Benutzertabelle speichert. Wenn beispielsweise current_user drei Produkte im Einkaufswagen mit den IDs 1,2,3 und Klicks auf die Schaltfläche "Speichern" in einem Einkaufswagen anzeigt, möchte ich diese drei IDs durch Ganzzahlen in den drei Spalten speichern können: product_one, product_two , product_three des aktuellen Benutzers.So speichern Sie IDs in Benutzerspalten

Bisher das sind meine Modelle:

class Item < ActiveRecord::Base 
    has_one :cart 
end 

class User < ActiveRecord::Base 

    has_one :cart 
    has_many :items, through: :cart 
end 

class Cart < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :item 

    validates_uniqueness_of :user, scope: :item 
end 

Meine Controller:

class ItemsController < ApplicationController 
    before_action :set_item, only: [:show, :edit, :update, :destroy] 

    respond_to :html, :json, :js 

    def index 
    @items = Item.where(availability: true) 
    end 

    def show 
    end 

    def new 
    @item = Item.new 
    end 

    def edit 
    end 

    def create 
    @item = Item.new(item_params) 
    @item.save 
    respond_with(@item) 
    end 

    def update 
    @item.update(item_params) 
    flash[:notice] = 'Item was successfully updated.' 
    respond_with(@item) 
    end 

    def destroy 
    @item.destroy 
    redirect_to items_url, notice: 'Item was successfully destroyed.' 
    end 

    private 
    def set_item 
     @item = Item.find(params[:id]) 
    end 

    def item_params 
     params.require(:item).permit(:name, :description, :availability) 
    end 
end 

den Warenkorb Controller:

class CartController < ApplicationController 

    before_action :authenticate_user!, except: [:index] 


    def add 
    id = params[:id] 
    if session[:cart] then 
     cart = session[:cart] 
    else 
     session[:cart] = {} 
     cart = session[:cart] 
    end 
    if cart[id] then 
     cart[id] = cart[id] + 1 
    else 
     cart[id] = 1 
    end 
    redirect_to :action => :index 
    end 


    def clearCart 
    session[:cart] = nil 
    redirect_to :action => :index 
    end 






    def index 
    if session[:cart] then 
     @cart = session[:cart] 
    else 
     @cart = {} 
    end 

    end 
end 

Und ich bin mit Devise für die Authentifizierung ..

+0

Es ist seltsam, dass Ihr Einkaufswagen gehört to_to: item, nicht wahr? Bedeutet Benutzer hat einen Warenkorb, und Warenkorb ist verbunden (gehört zu) nur ein Element. Also wird der Benutzer nur einen Gegenstand haben, richtig? Wie stellen Sie sich derzeit vor, mehrere Elemente mit einem einzelnen Benutzer zu verbinden? –

+0

Übrigens, erklären Sie, was Sie erreichen möchten, indem Sie IDs von Produkten im Benutzermodell in expliziten Spalten speichern. Möchten Sie den Speicher "denormalisieren", d. H. Einen "Cache" von Element-IDs in der Benutzertabelle zusätzlich zur normalen (relationalen) Verbindung vom Benutzer zum Artikel über den Einkaufswagen haben? Oder möchten Sie eine Verbindung zwischen Benutzer und Produkt herstellen, indem Sie diesen Ansatz verwenden (d. H. Sie haben keinen anderen Weg vom Benutzer zu den Elementen, sondern nur durch diese Spalten). Wie auch immer, als was ist Ihr Gebäude ist auf jeden Fall nicht-Standard-und auf den ersten Blick, sehr ineffiziente Art der Verbindung, bitte erklären, warum bauen Sie es. –

+0

@PavelBulanov Es kann ein falscher Ansatz sein. Grundsätzlich muss ich wissen, welche Produkte der Benutzer ausgewählt hat, um diese Produkte zu versenden. Es kann jede Art sein, wie diese verknüpft sind, aber ich muss die kombinierte Benutzer-ID und Artikel-ID kennen. Ich brauche nur diese Daten. –

Antwort

2

Ich denke Sie haben möglicherweise die Rails-Beziehungen und deren Verwendung falsch verstanden. Da die Methoden zur Definition der Beziehung ziemlich wörtlich sind, sollten Sie sich Ihre Modelle genau ansehen und sie "lesen".

  • Ein Element hat einen Warenkorb
  • Ein Wagen auf einen Artikel

Macht es Sinn, gehört, dass ein Element einen Wagen hat? Wäre es für einen Wagen nicht sinnvoller, einen oder mehrere Artikel zu haben?

  • Ein Wagen hat einen oder mehrere Artikel
  • Ein Artikel in einen Warenkorb

Und dann, die Sie gerade übersetzen, dass in Schienen Methoden gehört:

class User < ActiveRecord::Base 
    has_one :cart 
end 

class Cart < ActiveRecord::Base 
    belongs_to :user #carts table must have a user_id field 
    has_many :items 
end 

class Item < ActiveRecord::Base 
    belongs_to :cart #items table must have a cart_id field 
end 

Jetzt wollen wir Rückkehr zu den Literalen. Also, wenn ich eine user habe und wissen möchte, welche Gegenstände er in einem Wagen hat, was mache ich?

  • Ich weiß, dass ein Benutzer einen Warenkorb
  • Ich weiß, dass ein Wagen hat ein oder mehrere Objekte

Also, um die Elemente zu erholen, die ein Benutzer in einem Wagen hat:

user.cart.items 

Und beantworten Sie Ihre ursprüngliche Frage, wie Sie die Artikel zu einem user speichern? Das musst du nicht. Wenn der Benutzer eine cart hat und diese cartitems dann automatisch user hat Elemente (Zugriff auf sie über die cart, wie oben angegeben).

+0

danke !! Das hilft mir sehr! :) Prost –