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_id
和 material_id
列(均为整数)。
在此处了解有关此类协会的更多信息:
我最终将我的模型关联更改为仅使用 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)
我正在学习活动模型,我正在尝试检索关联。
我的模特是:
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_id
和 material_id
列(均为整数)。
在此处了解有关此类协会的更多信息:
我最终将我的模型关联更改为仅使用 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)