Rails:仅显示属于当前模型的项目

时间:2013-12-27 04:45:41

标签: ruby-on-rails ruby-on-rails-3 controller associations

我有一个文件控制器,模型&视图和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),但在浏览器中查看时,这只是一个空白列表。

我需要在这做什么?

2 个答案:

答案 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上查询以查找具有特定文档类型的所有文档。