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 %>
素早く親切な答えフレデリックに感謝します。私はそれを与え、報告を返す。 –
D'ohは、私の質問ではなく答えを編集しましたが、うまくいきました。 –
こんにちは、私はもう一度やってみましたが、このエラー「保護属性を大量に割り当てることはできません:」を取得しました。あなたは何か提案していますか? – Teo