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

时间:2015-03-30 13:36:08

标签: ruby-on-rails postgresql activerecord nested-attributes ruby-on-rails-4.2

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

我的模特是:

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

我想我错过了什么。 任何提示?

提前致谢, Leandro的

2 个答案:

答案 0 :(得分:0)

当您使用has_and_belongs_to_many关联时,您应该拥有compositions_materialscomposition_idmaterial_id列(均为整数)。

此处有关此类关联的更多信息:

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

答案 1 :(得分:0)

我最终将模型关联更改为仅使用 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)