5

私の Ruby on Rails アプリケーションには DocumentType モデルと PersonType モデルがあります。Document は DocumentType (例: Letter、Postcard) であり、1 人以上の人をリストします。各 Person には、Document との関係 (送信者、受信者、作成者など) を表す PersonType が割り当てられます。ユーザーは、DocumentType に関連する PersonTypes に People を割り当てることのみが許可されます。

テーブル定義:

create_table "document_types", :force => true do |t|
 t.string   "name" 
end

create_table "document_types_person_types", :id => false, :force => true do |t|
 t.integer "document_type_id"
 t.integer "person_type_id"
end

create_table "person_types", :force => true do |t|
 t.string   "name"
end

モデル定義:

class Document < ActiveRecord::Base
 has_many :people, :dependent => :destroy
 belongs_to :document_type
end

class DocumentType < ActiveRecord::Base
 has_many :documents
 has_and_belongs_to_many :person_types
end

class Person < ActiveRecord::Base
belongs_to :document
has_and_belongs_to_many :person_types
end

class PersonType < ActiveRecord::Base
 has_and_belongs_to_many :people
 has_and_belongs_to_many :document_types
end

テーブルの例:

documents
 id:   1 
 document_type_id: 1
 name: Letter from John Smith  to Jane and Joe Smith

document_types
 id: 1  |  name: letter

document_types_person_types
 document_type_id: 1  |   person_type_id:   1
 document_type_id: 1  |   person_type_id:   2
 document_type_id: 1  |   person_type_id:   4

person_types
 id: 1  |  name: Sender
 id: 2  |  name: Recipient
 id: 3  |  name: Photographer
 id: 4  |  name: Author  

people
 id: 1  |  document_id: 1  |  name: John Smith  |  person_type_id: 1
 id: 2  |  document_id: 1  |  name: Jane Smith  |  person_type_id: 2
 id: 3  |  document_id: 1  |  name: Joe Smith   |  person_type_id: 2

ユーザーが Person を Document に追加する場合、その Person と Document との関係を選択し、それを Person モデル (または拡張モデル) 内に保存します。

Document は、その DocumentType に関連する PersonTypes のみを表示します (たとえば、写真には Author はありませんが、Photographer はあります)。

結局のところ...私が達成したいのは、DocumentTypesの管理インターフェイスであり、すべてのPersonTypesを表示し、PersonTypeが該当する場合はチェックボックスを選択できるdocument_types_person_typesテーブルを表します:

EDIT DocumentType Letter
Sender       [x]
Recipient    [x]
Photographer [ ]
Author       [x]

選択された PersonTypes は、ドキュメントに Person を追加するときに使用できる唯一の PersonTypes になります。うまくいけば、私の熟考された説明の試みが表しているかもしれないよりももっと簡単です. 誰でもポインタを提供できますか?

編集: 将来の参考のために、以下のフレデリックの回答に基づいて、これはうまくいきました

<% for pt in PersonType.find(:all) %>
  <%= check_box_tag "document_type[person_type_ids][]", pt.id, @document_type.person_types.include?(pt)  %>
  <%= pt.name %>
<% end %>
4

1 に答える 1

2

このような関連付けでは、DocumentType はperson_type_ids、関連付けられた人物タイプの ID の配列を返すメソッドを持ちます。

したがって、名前がdocument_type[person_type_ids][]各人物タイプの ID である一連のチェック ボックスを作成すると、送信されるのは、チェックされた人物タイプの ID を含む配列です。

document_type.update_attributes params[:document_type]

協会を更新します。ここでの唯一の微妙な点は、チェックボックスがチェックされていない場合、配列が送信されず (空の配列を送信することはできません)、関連付けられている人物タイプのリストがクリアされないことです。私は通常、値 0 を配列に追加する隠しフィールドを作成して (これが正当な ID になることはないとわかっているため)、コントローラーの配列からその 0 を削除することで、これを回避します。

于 2013-03-16T17:48:15.820 に答える