ruby-on-rails - Rails 必须并且属于许多正确的 Rails 协会吗?

标签 ruby-on-rails associations

我正在为应用程序设置 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)--

enter image description here

--

如果您的 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对象将与创建它的用户直接关联)。 ProductUser 模型也将通过 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/

相关文章:

ruby-on-rails - Rails Ruby Geometry Gem 投入生产

ruby-on-rails - 父表单中的嵌套资源创建

ruby-on-rails - 属于用户协会

ruby-on-rails - Rails 与多个自定义字段名称关联?

javascript - rails | Javascript同步多个字段,避免无限循环

ruby-on-rails - Rails 将 "action"呈现为自定义 url

ruby-on-rails - 更新内存中急切加载的关联

ruby-on-rails - 如果数据库中没有外键,Rails关联是否应该引发错误?

ruby-on-rails - 试图了解 Controller 如何使用插件/模块

associations - 如何使用 Sequelize 的belongsToMany 关联?