2013-04-01 3 views
1

Пользователь:Рельсы has_many: через зависимый: уничтожить себя очень странно

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 

TasksUser:

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/[email protected]/gems/sqlite3-1.3.7/lib/sqlite3/database.rb:91:in `initialize' 

линия с двумя звездочками является линия в вопросе - это, как представляется, искать запись в "tasks_users". "".

Если я все это изменить: условия => {: is_owner => ложь}, то 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 позволяет выполнить запрос и команду delete?

Благодаря

ответ

1

Уф - Надеюсь, я могу спасти кого-то от бьются головой эту стену в течение часа.

Проблема была в том, как я определил условия.

Это необходимо поместить в двойные кавычки:

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

Это было.

Смежные вопросы