2010-09-30 60 views
2

我想通过关联使用update_all,并且我得到mysql错误,任何人都知道为什么请吗?通过关联update_all

class Basket < ActiveRecord::Base 
    has_many :basket_items 
    has_many :articles, :through => :basket_items 

    def activate_articles 
    articles.update_all :active => true 
    end 
end 

class BasketItem < ActiveRecord::Base 
    belongs_to :basket 
    belongs_to :item 
    belongs_to :article 
end 


Mysql::Error: Unknown column 'basket_items.basket_id' in 'where clause': UPDATE `articles` SET `active` = 1 WHERE ((`basket_items`.basket_id = 114)) 
+0

看起来像你的'basket_items'表设置不正确。你能向我们展示模式吗? – 2010-09-30 18:17:22

+0

感谢您的期待丹尼尔,我已经更新了我原来的问题。 – dangerousdave 2010-09-30 19:32:40

回答

2

http://dev.rubyonrails.org/ticket/5353

貌似有使用N-N关联的has_many一个问题:通过使用更新所有。似乎没有做任何事情。

1-n关联似乎可以正常工作。

错误?

2

dev.rubyonrails移动它的门票GitHub的问题跟踪器。这里是移动链接:https://github.com/rails/rails/issues/522

@nolman张贴在售票

@daicoden和我在@square进行配对上这款本的帮助,我们能够给沿线的东西放在一起:

class Comment 
    class << self 
    def trash_all 
     sql = "UPDATE #{quoted_table_name} " 
     add_joins!(sql, {}) 
     sql << "SET #{sanitize_sql_for_assignment({:trashed => true})} " 
     add_conditions!(sql, {}) 
     connection.execute(sql) 
    end 
    end 
end 

现在你可以调用todolist.comments(:条件=> {:丢弃=>假})trash_all 这将导致以下SQL:

UPDATE `comments` INNER JOIN `todos` ON `todos`.id = `comments`.todo_id SET `trashed` = 1 WHERE (`comments`.`trashed` = 0 AND `todos`.`todolist_id` = 968316918) 

希望这会有所帮助!