Rails ActiveRecord - 从关联和关系错误中检索数据

Rails ActiveRecord - retrieve data from association and relation error

我正在学习活动模型,我正在尝试检索关联。

我的模特是:

class Composition < ActiveRecord::Base
  has_and_belongs_to_many :materials
  belongs_to :product
end



class Material < ActiveRecord::Base
 has_and_belongs_to_many :compositions
 has_many :products, through: :composition
end

class Product < ActiveRecord::Base
  has_many :compositions
  has_many :materials, through: :composition
  accepts_nested_attributes_for :materials
end

我的架构是

  create_table "compositions", force: :cascade do |t|
    t.integer  "product_id"
    t.integer  "material_id"
    t.integer  "material_quantity"
    t.datetime "created_at",        null: false
    t.datetime "updated_at",        null: false
  end


  create_table "materials", force: :cascade do |t|
    t.string   "name"
    t.decimal  "unit_cost"
    t.string   "unit_measure"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end


  create_table "products", force: :cascade do |t|
    t.string   "name"
    t.string   "description"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

在我的 CompositionsController 索引方法中,我想检索产品 ID 的所有原材料。

路线是:

  resources :products do
    resources :compositions
  end

我现在拥有的是:

  def index
    @product = Product.find(params[:product_id])
    @compositions = @product.compositions
  end

如何从@compositions 检索材质属性?

当我尝试使用

@compositions = @product.compositions.includes(:materials)

它给我错误:

PG::UndefinedTable: ERROR:  relation "compositions_materials" does not exist
LINE 5:                WHERE a.attrelid = '"compositions_materials"'...
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"compositions_materials"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

我想我错过了什么。 有什么提示吗?

提前致谢, 莱安德罗

当您使用 has_and_belongs_to_many 关联时,您应该有 compositions_materials table 以及 composition_idmaterial_id 列(均为整数)。

在此处了解有关此类协会的更多信息:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

我最终将我的模型关联更改为仅使用 has_many 到 belongs_to:

class Product < ActiveRecord::Base
  has_many :compositions
  has_many :materials, through: :composition
end

class Material < ActiveRecord::Base
 has_many :compositions
 has_many :products, through: :composition
end

class Composition < ActiveRecord::Base
  belongs_to :material, :class_name => "Material", :foreign_key => 'material_id'
  belongs_to :product
end

我正在使用此查询检索主要结果中的属性:

@product = Product.find(params[:product_id])

@compositions = @product.compositions.includes(:material).references(:materials)