我有一个文件控制器,模型&视图和DocumentTypes控制器,模型和&视图。文档has_and_belongs_to_many
DocumentTypes和DocumentType has_and_belongs_to_many
文档。我在Documents索引模板上有一个表单,在添加新文档时,我将document_type_id设置为等于从下拉列表中选择的任何文档类型。看起来如此:
<%= form_for Project.new, :html => { :multipart => true } do |f| %>
<%= select_tag "document[document_type_id][]", options_from_collection_for_select(DocumentType.find(:all), "id", "title") %>
<% end %>
我接下来要做的就是仅列出在文档类型显示页面上分配给当前文档类型的文档。我目前只有这个:
// Controller
def show
...
@documents = Document.find(:all)
end
// View
<% @documents.each do |document| %>
...
<% end %>
我不完全确定在添加新文档时是否正确设置了document_type_id,因此很可能是我的问题。我尝试使用.where
之类的:@documents = Document.where(:document_type_id => 1)
,但在浏览器中查看时,这只是一个空白列表。
我需要在这做什么?
答案 0 :(得分:2)
这是一个极小的传球示例。 它还演示了一种快速的方法,可以使用测试来解决代码,直到您拥有所需的内容:
> rails new so20794896
> cd so20794896
> rails g scaffold documents
> rails g scaffold document_types
> rails g migration create_document_types_documents document_id:integer document_type_id:integer
> rake db:migrate
编辑app / models / document.rb
class Document < ActiveRecord::Base
has_and_belongs_to_many :document_types
end
编辑app / models / document_type.rb
class DocumentType < ActiveRecord::Base
has_and_belongs_to_many :documents
end
编辑test / models / document_test.rb
require 'test_helper'
class DocumentTest < ActiveSupport::TestCase
test "find by document type" do
one = documents(:one)
doc_type = document_types(:two)
one.document_types << doc_type
one.save!
found_docs = DocumentType.find(doc_type.id).documents
assert_equal one, found_docs.first
assert_equal 1, found_docs.length
end
end
然后通过以下方式运行测试:
> rake test TEST=test/unit/document_test.rb
并查看log/test.log
以查询此问题,例如:
SELECT "document_types".* FROM "document_types" INNER JOIN "document_types_documents"
ON "document_types"."id" = "document_types_documents"."document_type_id"
WHERE "document_types_documents"."document_id" = ? [["document_id", 980190962]]
答案 1 :(得分:0)
我认为你没有很好地建立关系。 如果您的文档属于文档类型,则关系应该类似于
Document belongs_to document_type
并将document_type_id添加到文档表。
然后您的查询将有效。
如果你真的想要has_and_belongs_to_many关系,那么你必须设置中间表。似乎
Document has_and_belongs_to_many document_types through: document_type_relation
DocumentType has_and_belongs_to_many documents through: document_type_relation
DocumentTypeRelation将包含document_id和document_type_id 然后,您可以在DocumentTypeRelation上查询以查找具有特定文档类型的所有文档。