我是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
几个问题:
我需要做出哪些更改才能解决错误?
感谢。
答案 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