0

그래서 내 레일 시스템에 제품 시스템과 장바구니를 만들었습니다. 내가 가지고있는 목표는 카트에서 저장된 제품의 ID를 사용자 모델에 추가하는 것입니다. 따라서 장바구니보기 페이지에는 장바구니에 추가 된 모든 제품의 목록이 있으며 해당 제품을 사용자 테이블의 열에 저장하는 저장 버튼을 추가하려고합니다. 예를 들어 current_user가 장바구니에 1,2,3 개의 ID가있는 3 개의 제품을 광고하고 장바구니의 '저장'버튼을 클릭하면 3 개의 열에 정수로 3 개의 ID를 저장할 수 있습니다. product_one, product_two , current_user의 product_three.아이디를 사용자 열에 저장하는 방법

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 

내 컨트롤러 :

지금까지이 내 모델입니다

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 

내 카트 컨트롤러 :

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 

그리고 인증을 위해 고안를 사용하고 있습니다 ..

+0

카트가 속한 것이 이상합니다. 항목 : 그렇지 않습니까? 사용자가 카트를 하나 가지고 있고 장바구니가 단 하나의 항목에 연결되어 있습니다. 따라서 사용자는 하나의 항목 만 가질 수 있습니다. 맞습니까? 현재 여러 항목을 단일 사용자에게 연결하는 방법은 무엇입니까? –

+0

그런데 제품의 ID를 명시 적 컬럼 안에 사용자 모델에 저장하여 원하는 것을 설명하십시오. 사용자가 장바구니를 통해 항목간에 정상적으로 (관계형) 연결하는 것 외에 사용자 테이블에 항목 ID의 "캐시"가있는 저장소를 "비정규 화"하시겠습니까? 또는이 방법을 사용하여 사용자와 제품 간 연결을 만들고 싶습니다 (즉, 사용자에서 항목까지는 다른 방법이 없지만이 열을 통해서만 가능함). 어쨌든, 당신의 건물은 무엇보다 비표준이며, 첫눈에 비효율적 인 연결 방법이 무엇인지, 왜 당신이 그것을 만들고 있는지 설명하십시오. –

+0

@PavelBulanov 잘못된 접근 일 수 있습니다. 기본적으로 나는 그 제품을 선적하기 위해 사용자가 선택한 제품을 알아야합니다. 그것들은 연관되어있는 어떤 방법이 될 수 있지만 병합 된 사용자 ID와 항목 ID를 알아야합니다. 이 데이터를 가져와야합니다. –

답변

2

Rails 관계와 그 사용법을 잘못 이해했을 수도 있습니다. 관계를 정의하는 방법은 거의 문자 그대로이므로 모델을 잘보고 '읽으십시오'.

  • 항목은
  • 카트는이 항목이 하나의 카트를 가지고 이해가 않는 항목

에 속하는 하나의 카트가? 장바구니에 물건을 갖고 있거나 여러 장을 가지고있는 것이 더 합리적이지 않습니까?

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 

을 이제 복귀하자 :

  • 카트는 그냥 레일 방법으로 그 번역, 하나 개 이상의 항목
  • 한 항목이

그리고 카트에 속해있다 리터럴에게. 따라서 user이 있고 장바구니에있는 항목을 알고 싶다면 어떻게해야합니까?

  • 나는 카트가 있음을 알고있는 사용자가 하나 카트
  • 을 가지고 알고 하나 이상의 항목
  • 그래서

는, 사용자가 장바구니에있는 항목 복구 :

user.cart.items 

원래 질문에 답하고 항목을 user에 저장하는 방법은 무엇입니까? 너는 필요 없어. 사용자가 cart이고이 cartitems이면 자동으로 user에 항목이 있습니다 (위에서 설명한대로 cart을 통해 액세스).

+0

감사합니다 !! 이것은 나를 많이 돕는다! :) 건배 –