今天我正在尝试实现以下内容:
站内有产品,有用户。 如果用户已登录(如果是 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 方法可以做到这一点 :) 如果可以,请帮助我。 谢谢!
最佳答案
您应该创建三个表:User
、Product
和 ConsumedProducts
。
product
表和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,请参阅文档以了解不同之处(如果您的中间表没有额外的属性,请使用第二个,这是您的情况,当您命名额外的表)。
如果你真的想那样实现,你可以像你实现的那样,但是改变了 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
关于ruby-on-rails - 将产品标记为已消耗,Rails 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15481131/