我正在为应用程序设置 Rails 关联,但不确定我的关联是否适合我的用例。用例是:用户可以添加一次产品。创建后,其他用户就可以将相同的产品添加到应用程序内自己的“提要”中。我希望能够执行 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"
最佳答案
这样做:
#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
您需要添加 appropriate foreign_key
到您的 User
模型(belongs_to :user
关联的 Product
模型中的 user_id
)--
--
如果您的 has_and_belongs_to_many
关系已经有效,则上述内容应该足够了。
如果没有,你需要查找this documentation看看它是如何工作的,然后创建一个名为 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
它将允许您为用户创建单个产品(即Product
对象将与创建它的用户直接关联)。 Product
和 User
模型也将通过 habtm
关系连接起来。
在您的 Controller 中,您可以使用以下内容:
#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
关于ruby-on-rails - Rails 必须并且属于许多正确的 Rails 协会吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34306076/