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