繁体   English   中英

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

[英]Rails: Show only items belonging to current model

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

我需要做什么?

这是一个极小的传球示例。 它还演示了一种快速的方法来使用测试来解决代码,直到您拥有所需的内容:

> 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]]

我认为你没有很好地建立关系。 如果您的文档属于文档类型,那么关系应该是这样的

Document belongs_to document_type

并将document_type_id添加到文档表。

那么你的查询就可以了。

如果你真的想要has_and_belongs_to_many关系,那么你必须设置中间table.like

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM