2010-09-30 88 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) 

希望這會有所幫助!