2013-03-16 17 views
5

My Ruby on Railsアプリケーションには、DocumentTypeモデルとPersonTypeモデルがあります。文書はDocumentType(例えば、Letter、Postcard)であり、1人以上のPeopleをリストします。各Personには、Document(送信者、受信者、作成者など)との関係を表すPersonTypeが割り当てられます。ユーザーは、DocumentTypeに関連するPersonTypesにのみPeopleを割り当てることができます。多対多関係に基づくRuby on Railsのチェックボックスフォーム

表の定義:

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モデル内に格納される関係(または拡張mod el)。

ドキュメントには、そのドキュメントタイプに関連するPersonTypesのみが表示されます(たとえば、写真には著者はいませんが、写真家がいます)。

だから、すべてのことの後...私は何を達成したいことはすべてPersonTypesを示し、PersonTypeでは、適用される場合は、チェックボックスを選択するために、私を可能にdocument_types_person_typesテーブルを表す、DocumentTypesのための管理インタフェースである:

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

答えて

2

を働いたのDocumentTypeは、関連のIDの配列を返すperson_type_ids方法を持っています人のタイプ。その名前は、document_type[person_type_ids][]で、値がそれぞれの人がチェック要員タイプのIDを含む配列が提出されるか、その後タイプのIDであるチェックボックスのセットを作成する場合はそのため

document_type.update_attributes params[:document_type] 

関連付けを更新しますか。ここでの唯一の微妙な点は、チェックボックスがチェックされていなければ、配列は提出されず(空の配列を提出することはできません)、関連付けられた人物タイプのリストはクリアされないということです。私は通常これを回避するために、値0を配列に加えた(私は正当なIDではないことを知っているので)隠しフィールドを持っていて、コントローラの配列から0を取り除きます。

+0

素早く親切な答えフレデリックに感謝します。私はそれを与え、報告を返す。 –

+0

D'ohは、私の質問ではなく答えを編集しましたが、うまくいきました。 –

+0

こんにちは、私はもう一度やってみましたが、このエラー「保護属性を大量に割り当てることはできません:」を取得しました。あなたは何か提案していますか? – Teo

関連する問題