今天我正在尝试实施以下内容:
网站中有产品和用户。 如果用户已登录(如果是current_user),他可以标记产品,就像他正在使用该产品一样。之后他可以点击一个按钮,将其从消费的按钮中删除。
我正在努力解决这个问题:
的routes.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的方法来做到这一点:)如果可以,请帮助我。 谢谢!
答案 0 :(得分:3)
您应该创建三个表: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
答案 1 :(得分: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
。
答案 2 :(得分:0)
看看Rails'nested resources。它使您可以轻松地在其他路线中创建路线。例如:
resources :users do
resources :products
end
POST users/12/products/449 products#create
PUT users/12/products/449 products#update
...
然后,在您的ProductsController中,您将可以访问param[:user_id]
和param[:product_id]
。虽然您可能想要为Products创建一个新表以及产品和用户之间的映射表(可能是UserProducts?)。
查看Rails association basics以了解有关将表格链接在一起的更多信息。