1

今天我正在尝试实现以下内容:

网站上有产品,有用户。如果用户已登录(如果 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

您应该创建三个表UserProductConsumedProducts。表productuser表是多对多的关系。中间表将是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,请参阅文档以了解差异(如果您的中间表没有额外属性,则使用第二个,这是您的情况,在命名额外表时要小心)。

如果你真的想这样实现,你可以像你实现的那样,但改变 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 :through当你有common attributes桌子时使用。

于 2013-03-18T16:02:43.993 回答
0

看看 Rails 的嵌套资源。它使您能够轻松地在其他路线内创建路线。例如:

resources :users do
  resources :products
end

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

然后,在您的 ProductsController 中,您将可以访问 aparam[:user_id]param[:product_id]. 尽管您可能希望为 Products 创建一个新表以及 Products 和 Users 之间的映射表(可能是 UserProducts?)。

查看Rails 关联基础知识以了解有关将表链接在一起的更多信息。

于 2013-03-18T16:03:02.293 回答