Rails 3.1.RC4 で作成している単純なプロジェクト + タスク アプリケーションがあります。プロジェクト名、タスクがあり、各タスクは人に割り当てられます。プロジェクト フォームは単純で、(1) タスク名と (2) タスクと担当者の 2 つのボックスのみです。バックエンドでは、タスクと担当者を解析し、それらすべてを適切なモデルに入れたいと考えています。
サンプル入力
プロジェクト名:ピップの誕生日パーティー
タスク、担当者:
- きれいなバスルーム、ジョン
- シャインシューズ、サリー
- ケーキを焼いて、ピーター
- シャンパンを買う、スーザン
次の 4 つのモデルがあります。
class Project < ActiveRecord::Base
has_many :tasks
has_many :assignments, :through => :tasks
has_many :people, :through => :assignments
attr_writer :task_text
after_save :assign_tasks
def task_text
@task_text || tasks.map(&:name).join(' ')
end
private
def assign_tasks
if @task_text
self.tasks = @task_text.split(/\n/).map do |line|
assignment = line.split(',').first
assignee = line.split(',').last
Task.find_or_create_by_name(assignment)
Task.people.find_or_create_by_name(assignee)
end
end
end
end
class Task < ActiveRecord::Base
attr_accessible :name
belongs_to :project
has_many :assignments
has_many :peoples, :through => :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :tasks
belongs_to :peoples
end
class People < ActiveRecord::Base
has_many :assignments
has_many :tasks, :through => :assignments
end
ここに 1 つの形式のパーシャルがあります。
<%= form_for @project do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<%= f.label :task_text, "Tasks, assignees" %><br />
<%= f.text_area :task_text %>
</p>
<p><%= f.submit %></p>
<% end %>
現在、「人」に対して未定義のメソッドエラーが発生しています。
多対多モデル、仮想属性、およびネストされたモデルをカバーする Railscasts をレビューしましたが、飛躍することはできませんでした。Javascript を使用せずにこのタスクを実行する必要があります。