我试图将产品附件功能添加到Spree商店。例如。 product
附有许多documents
:小册子,说明手册等。我无法获得文档和产品之间的关系。
我可以使用Paperclip gem作为附件功能,因为Spree已经将它用于图像。
我有"文件"型号:models/spree/document.rb
:
class Spree::Document < ActiveRecord::Base
belongs_to :products, class_name: "Spree::Product"
has_attached_file :pdf
end
然后我尝试将文档模型与Spree::Product
中的models/spree/product_decorator.rb
模型相关联:
Spree::Product.class_eval do
has_many :documents, dependent: :destroy
end
然后我添加了迁移:
class CreateDocuments < ActiveRecord::Migration
def change
create_table :spree_documents do |t|
t.timestamps
end
end
end
class AddPdfToDocuments < ActiveRecord::Migration
def self.up
add_attachment :spree_documents, :pdf
end
def self.down
remove_attachment :spree_documents, :pdf
end
end
现在我进入rails控制台查看它是否有效:
#=> prod = Spree::Product.first
#=> prod.document
#=> PG::UndefinedColumn: ERROR: column spree_documents.product_id does not exist
#=> LINE 1: ..."spree_documents".* FROM "spree_documents" WHERE "spree_doc...
^
#=> : SELECT "spree_documents".* FROM "spree_documents" WHERE "spree_documents"."product_id" = $1
似乎我没有正确定义文档和产品之间的关系,但我不确定问题是什么。
答案 0 :(得分:2)
您似乎从未在product_id
表格中添加Spree::Documents
列。当您定义模型belongs_to
另一个模型时,它会告诉ActiveRecord第一个模型在其表中是[relation]_id
列。
您只需确保在迁移中添加t.references :product
,所以它看起来像:
class CreateDocuments < ActiveRecord::Migration
def change
create_table :spree_documents do |t|
t.references :product
t.timestamps
end
end
end