だから、私は親子関係を可能にするはずのモデルTaskを持っています。モデル定義の関連部分は次のとおりです。
class Task < ActiveRecord::Base
attr_accessible :relationships_attributes
has_many :relationships, :foreign_key => "subtask_id", :dependent => :destroy
has_many :parents, :through => :relationships, :source => "parent"
has_many :reverse_relationships, :foreign_key => "parent_id", :class_name => "Relationship", :dependent => :destroy
has_many :subtasks, :through => :reverse_relationships, :source => "subtask"
end
リレーションシップ モデルの定義は次のとおりです。
class Relationship < ActiveRecord::Base
attr_accessible :parent_id
belongs_to :parent, :class_name => "Task"
belongs_to :subtask, :class_name => "Task"
validates :parent_id, presence: true
validates :subtask_id, presence: true
end
私がしたいのは、特定のタスクの親タスク ID を選択/削除できるチェック ボックスを含むフォームを使用して、基礎となる「関係」データベース テーブルに存在するエントリを変更することです。これは、check_box_tag の edit.html.erb ファイルにあるコードです。
<p>
<br>
<%= f.label :parent_tasks %>
<% for task in Task.find(:all) %>
<div>
<%= check_box_tag "subtask[parent_ids][]", task.id, @task.parent_ids.include?(task.id)%>
<%= task.id %>
</div>
<% end %>
</p>
フォームの [保存] ボタンを押すと、エラーは発生しませんが、チェック ボックスで行った変更は保存されません。ログには次のエントリが表示されます (関係テーブルからの削除/挿入は試行されません)。
Started PUT "/dev/tasks/25" for 127.0.0.1 at 2012-04-30 14:59:13 -0400
Processing by Dev::TasksController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"+ShrgdwgD7G1l9iDEuCsZ84d9XCwXh01p3BwJARJScE=", "task"=>{"name"=>"task bla", "description"=>"", "project_id"=>"", "task_status_id"=>"1"}, "subtask"=>{"parent_ids"=>["19", "22"]}, "commit"=>"Save changes", "id"=>"25"}
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'z7IrWT7R7u7i6nhW26J2Og' LIMIT 1
Task Load (0.3ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = $1 LIMIT 1 [["id", "25"]]
(0.1ms) BEGIN
(0.1ms) COMMIT
Redirected to http://localhost:3000/dev/tasks
Completed 302 Found in 8ms (ActiveRecord: 1.3ms)
私は以前、Teams_users という結合モデルを持つ 2 つの異なるモデル User と Team に対して達成しようとしている機能を実装していました。これは、teams_users データベース テーブルへの変更を正常に保存したアクションのログです。
Started PUT "/teams/1" for 127.0.0.1 at 2012-04-30 14:46:11 -0400
Processing by TeamsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"+ShrgdwgD7G1l9iDEuCsZ84d9XCwXh01p3BwJARJScE=", "team"=>{"name"=>"My team", "user_ids"=>["3", "8", "9", "100", "101"]}, "commit"=>"Save", "id"=>"1"}
Team Load (0.3ms) SELECT "teams".* FROM "teams" WHERE "teams"."id" = $1 LIMIT 1 [["id", "1"]]
(0.1ms) BEGIN
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (3, 8, 9, 100, 101)
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "teams_users" ON "users"."id" = "teams_users"."user_id" WHERE "teams_users"."team_id" = 1
(0.2ms) DELETE FROM "teams_users" WHERE "teams_users"."team_id" = 1 AND "teams_users"."user_id" IN (2, 4)
(38.3ms) INSERT INTO "teams_users" ("team_id", "user_id") VALUES (1, 3) RETURNING "id"
Team Exists (0.4ms) SELECT 1 FROM "teams" WHERE (LOWER("teams"."name") = LOWER('My team') AND "teams"."id" != 1) LIMIT 1
(39.9ms) COMMIT
Redirected to http://localhost:3000/teams/1
Completed 302 Found in 88ms (ActiveRecord: 81.0ms)
現在のコードを機能させるために必要な変更が小さく、誰かがそれらまたは私がまだ遭遇していない関連する投稿に私を向けることができることを願っています:)。