1

ユーザー:

class User < ActiveRecord::Base

  attr_accessible :email, :username, :password, :password_confirmation, :remember_me

  has_many :tasks_users, :dependent => :destroy, :conditions => {:is_owner => true}
  has_many :tasks, :through => :tasks_users, :source => :task

仕事:

class Task < ActiveRecord::Base
  include RankedModel
  ranks :sort_order

  acts_as_taggable

  has_many :tasks_users  
  has_many :users, :through => :tasks_users

タスクユーザー:

class TasksUser < ActiveRecord::Base
    attr_accessible :is_owner
    belongs_to :user
    belongs_to :task

    validates_uniqueness_of :user_id, :scope => [:user_id, :task_id]
end

ここで重要なのは依存破壊です。

結合モデルを破棄する必要があるユーザーを破棄しようとすると、次の奇妙な SQL エラーが発生します。

User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 17]]
   (0.1ms)  begin transaction
  ActsAsTaggableOn::Tagging Load (0.1ms)  SELECT "taggings".* FROM "taggings" WHERE "taggings"."tagger_id" = 17 AND "taggings"."tagger_type" = 'User'
  TasksUser Load (0.1ms)  SELECT "tasks_users".* FROM "tasks_users" WHERE "tasks_users"."user_id" = 17 AND "tasks_users"."is_owner" = 't'
Could not log "sql.active_record" event. NoMethodError: undefined method `name' for nil:NilClass
**SQLite3::SQLException: no such column: tasks_users.: DELETE FROM "tasks_users" WHERE "tasks_users"."" = ?**
   (0.1ms)  rollback transaction
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: tasks_users.: DELETE FROM "tasks_users" WHERE "tasks_users"."" = ?
from /home/steveq/.rvm/gems/ruby-1.9.3-p194@rails32/gems/sqlite3-1.3.7/lib/sqlite3/database.rb:91:in `initialize'

アスタリスクが 2 つ付いている行が問題の行です。"tasks_users"."" 内のレコードを検索しているようです。

:conditions => {:is_owner => false} を変更するだけの場合、SQL は問題なく実行されます。

  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 17]]
   (0.1ms)  begin transaction
  ActsAsTaggableOn::Tagging Load (0.2ms)  SELECT "taggings".* FROM "taggings" WHERE "taggings"."tagger_id" = 17 AND "taggings"."tagger_type" = 'User'
  TasksUser Load (0.1ms)  SELECT "tasks_users".* FROM "tasks_users" WHERE "tasks_users"."user_id" = 17 AND "tasks_users"."is_owner" = 'f'
  List Load (0.2ms)  SELECT "lists".* FROM "lists" WHERE "lists"."owner_id" = 17
  Relationship Load (0.1ms)  SELECT "relationships".* FROM "relationships" WHERE "relationships"."user_id" = 17
  SQL (0.3ms)  DELETE FROM "users" WHERE "users"."id" = ?  [["id", 17]]
   (299.4ms)  commit transaction

ここで何が起こっているのか、また is_owner の条件を true から false に変更すると、クエリと削除ステートメントを実行できるようになるのはなぜですか?

ありがとう

4

1 に答える 1

1

うーん、他の誰かがこの壁に頭を 1 時間ぶつけないようにできれば幸いです。

問題は、:条件の指定方法でした。

二重引用符で囲む必要がありました。

  has_many :tasks_users, :dependent => :destroy, :conditions => "is_owner = 'true'"

それだけでした。

于 2013-04-01T19:32:00.270 に答える