Rails必须和属于许多正确的rails关联?

时间:2015-12-16 07:20:08

标签: ruby-on-rails associations

我正在为应用设置我的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"

2 个答案:

答案 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 -

appropriate foreign_key

-

如果您的has_and_belongs_to_many关系已经有效,则上述内容就足够了。

如果没有,您需要查找enter image description here以查看其工作原理,然后创建一个名为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对象将与创建它的用户直接关联)。 ProductUser模型也将与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 你可以参考

  1. http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many
  2. http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association