1

今日、私は次のことを実装しようとしています:

サイトには製品があり、ユーザーがいます。ユーザーがログインしている場合 (if current_user)、彼はその商品を消費しているように、その商品にマークを付けることができます。後でボタンをクリックして、消費されたボタンから削除できます。

私はこれに苦労しています:

ルート.rb

resources :users do
    member do
        get :product_add
        get :product_remove
    end
end

class UsersController < ApplicationController
    def product_add
      if current_user
         @product = Product.find(params[:id])
         @user = current_user
         @user.product = []
         @user.product << @product.id
         redirect_to @product, notice: "succesful..."
      else
         redirect_to @product, notice: "error..."
      end
    end
end

class AddProductsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :product, :text
  end
end

これを行うRailsの方法があるに違いありません:)できれば助けてください。ありがとう!

4

3 に答える 3

3

UserProductおよびの 3 つのテーブルを作成する必要がありますConsumedProductsproductテーブルとuserテーブルは多対多の関係にあります。中間テーブルはConsumedProducts、ユーザーの ID と製品の ID を格納する場所になります。

Class User < ActiveRecord::Base
   has_many :consumed_products;
   has_many :products, :through => :consumed_products
end

Class Product < ActiveRecord::Base
   has_many :consumed_products;
   has_many :users, :through => :consumed_products
end

Class ConsumedProducts < ActiveRecord::Base
   belongs_to :user
   belongs_to :product
end

ユーザーが製品を消費したことをクリックするたびに、中間テーブルに user_id と product_id を入力します。彼が製品のチェックを外すたびに、そのレコードを削除します。

また、代わりに has_and_belongs_to_many を使用することもできます。違いについてはドキュメントを参照してください(中間テーブルに追加の属性がない場合は、この2番目のものを使用してください。これはあなたの場合です。追加のテーブルに名前を付けるときは注意してください)。

本当にそのように実装したい場合は、実装したようなものを実装できますが、HTTP メソッドが変更されています。

resources :users do
    member do
        post :product_add
        delete :product_remove
    end
end

詳細については、この文献を確認してください: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

于 2013-03-18T16:00:00.327 に答える
1

many-to-manyリレーションの作成:

class CreateUsersProducts < ActiveRecord::Migration
  def change
    create_table :users_products, :id => false do |t|
      t.integer :user_id
      t.integer :product_id
    end
  end
end

Class User < ActiveRecord::Base
   has_and_belongs_to_many :products    
end

Class Product < ActiveRecord::Base
   has_and_belongs_to_many :users
end

def product_add
  if current_user
     @product = Product.find(params[:id])
     @user = current_user
     @user.products << @product.id
     redirect_to @product, notice: "succesful..."
  else
     redirect_to @product, notice: "error..."
  end
end

has_many with :throughcommon attributesfor tableがある場合に使用されます。

于 2013-03-18T16:02:43.993 に答える
0

Take a look at Rails' nested resources. It enables you to easily create routes inside other routes. For example:

resources :users do
  resources :products
end

POST users/12/products/449    products#create
PUT  users/12/products/449    products#update
...

Then, in your ProductsController, you'll have access to a param[:user_id] as well as a param[:product_id]. Though you'll probably want to create a new table for Products as well as a mapping table between Products and Users (maybe UserProducts?).

Take a look at the Rails association basics to learn more about linking tables together.

于 2013-03-18T16:03:02.293 に答える