Rails中的关联

时间:2015-04-28 18:41:36

标签: mysql ruby-on-rails

我是rails的新手,我正在努力了解关联的正确用法,因此在让代码工作时遇到问题。我已经回顾了rubyonrails.org,但仍然不确定。

我有3个表(mySQL),一个包含产品,一个用于销售这些产品的零售商,另一个用于将产品链接到零售商并且有价格。零售商可以存储许多产品,许多零售商可以销售产品。出于这个原因,我选择了“有许多并且属于许多人”的方法。

我的API将返回json,其中包含有关产品+销售产品的零售商+零售商销售产品的价格的详细信息。

当我运行我的代码时,我收到以下错误:
“在ProductPrice上找不到名为'产品'的协会;也许你拼错了它?”

我的模特:

    class ProductPrice < ActiveRecord::Base
    end

    class Products < ActiveRecord::Base
         has_and_belongs_to_many :productprices
    end

    class Retailer < ActiveRecord::Base
         has_and_belongs_to_many :productprices
    end

控制器:

module Api
    module V1
        class ProductDetailsController < ApplicationController          
            def show
                @prod = ProductPrice.joins(:products, :retailers)
                render json: @prod
            end 
        end
    end
end

迁移文件:

class CreateRetailers < ActiveRecord::Migration
  def change
    create_table :retailers do |t|
      t.string :name
      t.string :url
      t.string :aff_id
      t.string :img_url

      t.timestamps
    end
  end
end

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
        t.string :name
        t.string :brand
        t.string :category
        t.string :sub_cat
        t.string :nut_cal
        t.string :nut_pro
        t.string :nut_fat
        t.string :nut_sat_fat
        t.string :nut_carb
        t.string :nut_sugar
        t.string :nut_salt
        t.text :ingredients
        t.string :flavours
        t.text :description
        t.string :img_url

      t.timestamps
    end
  end
end

class CreateProductPrices < ActiveRecord::Migration
  def change
    create_table :product_prices do |t|
        t.belongs_to :product, index: true 
        t.belongs_to :retailer, index: true
        t.string :price
        t.string :aff_link

      t.timestamps
    end
  end
end

几个问题:

  • 鉴于我想要实现的方案,我使用了正确的方法 协会?
  • 我需要做出哪些更改才能解决错误?

    感谢。

2 个答案:

答案 0 :(得分:0)

在&#34; The Rails 4 Way&#34;中,作者提到了HABTM协会,但很快也说许多Rails开发人员认为它实际上已经过时了。我会将这些更改为简单的has_many关联,并在belongs_to模型中添加ProductPrices

此外,按照惯例,模型应该是单一的。所以,我会改变:

class Products < ActiveRecord::Base

为:

class Product < ActiveRecord::Base

答案 1 :(得分:0)

   class Product < ActiveRecord::Base
     has_many :product_retailers, dependent: :destroy, inverse_of: :product
     has_many :retailers, through: :project_retailers   
   end

   class Retailer < ActiveRecord::Base
      has_many :product_retailers, dependent: :destroy, inverse_of: :retailer
      has_many :products, through: :product_retailers     
    end

   class ProductRetailer < ActiveRecord::Base
     belongs_to :product
     belongs_to :retailer
     validates_presence_of :price, :product, :retailer
     validates_numeracality_of :price, greater_than: 0
   end

迁移

create_table :product_retailers do |t|
  t.float :price, null: false
  t.references :product, null: false
  t.references :retailer, null: false
end