我正在为应用设置我的rails关联,而且我不确定我的关联是否适合我的用例。用例是:产品可以由用户添加一次。一旦创建,其他用户就可以将相同的产品添加到他们自己的" feed"在应用程序内。我希望能够User.products
列出所有用户产品。对于产品,我希望能够执行Product.where(id: 2).users
之类的操作来列出已添加产品的所有用户。我目前正在使用has_and_belongs_to_many
协会,但我认为这对我想要实现的目标不正确?
用户模型:has_and_belongs_to_many :products
产品型号:has_and_belongs_to_many :users
add_index "products_users", ["product_id"], name: "index_products_users_on_product_id"
add_index "products_users", ["user_id"], name: "index_products_users_on_user_id"
答案 0 :(得分:2)
这样做:
#app/models/user.rb
class User < ActiveRecord::Base
has_many :created_products, class_name: "Product", foreign_key: :user_id #-> created product
has_and_belongs_to_many :products #-> list of products
end
#app/models/product.rb
class Product < ActiveRecord::Base
belongs_to :user #-> created the product
has_and_belongs_to_many :users #-> list of users
end
您需要将Electrify添加到User
模型中user_id
模型Product
中的belongs_to :user
-
-
如果您的has_and_belongs_to_many
关系已经有效,则上述内容就足够了。
如果没有,您需要查找以查看其工作原理,然后创建一个名为products_users
的连接表(其中填充了相应的数据):
$ rails g migration CreateProductsUsers
#db/migrate/create_products_users______.rb
class CreateProductsUsers < ActiveRecord::Migration
def change
create_table :products_users, id: false do |t|
t.references :product
t.references :user
end
end
end
$ rake db:migrate
它允许您为用户创建单个产品(IE Product
对象将与创建它的用户直接关联)。 Product
和User
模型也将与habtm
关系一起加入。
在您的控制器中,您可以使用以下内容:
#config/routes.rb
resources :products #-> url.com/products
scope "profile" do
resources :products, only: :index #-> url.com/profile/products
end
这将允许您使用以下内容:
#app/controllers/products_controller.rb
class ProductsController < ApplicationController
before_action :product, only: :edit
def index
@products = current_user.products #-> if you're using Devise
end
def edit
@product = current_user.created_products.find params[:id]
end
def new
@product = current_user.created_products.new
end
def create
@product = current_user.created_products.new product_params
@product.save
end
private
def product
redirect_to root_path, notice: "This is not your product" unless current_user.products.exists? params[:id]
end
def product_params
params.require(:product).permit(:x, :y, :z)
end
end
答案 1 :(得分:0)
为了能够使用has_and_belongs_to_many创建关联,您必须创建一个温度表容器2列是product_id,user_id 你可以参考