2012-09-16 102 views
0

的所有子元素我有如何摧毀一個關係

class List < ActiveRecord::Base 
    has_many :list_items 

class ListItem < ActiveRecord::Base 
    belongs_to :list 

我想選擇一個特定類型的所有名單,然後刪除所有相關list_items。我試過地圖和其他一些東西,但卡住了。

List.where('list_type_id=4').? 

我知道這應該是一個單線,但?

THX

**編輯#1 **

SyntaxError: (irb):94: syntax error, unexpected tCONSTANT, expecting ')' 
...ListItem.where('list_id = ?' List.where('list_type_id=4').id).... 
...        ^
(irb):94: syntax error, unexpected ')', expecting $end 
...ist.where('list_type_id=4').id).destroy_all 
...        ^
+0

也許像'List.where( 'list_type_id = 4')地圖(:list_items).flatten.destroy_all'? –

+0

這看起來最接近但我得到這個錯誤消息:'NoMethodError:undefined method'destroy_all'for#';真的很激動; thx – timpone

+0

是的,這是有道理的。那麼你可以用'each {| li |替換'destroy_all' li.delete}'。 –

回答

0

對於後人,

List.where('list_type_id=4').map(&:list_items).flatten.each {|li| li.delete } 

但耶,感覺應該有一個Railsier辦法做到這一點。 。

+0

不,@Joey Hoang答案是更合適 – ImranNaqvi

2

如果你想刪除列表,以及所有相關的項目

class List < ActiveRecord::Base 
    has_many :list_items, :dependent => :destroy 

這將設置關聯當列表被刪除時自動銷燬所有的list_items。

List.where('list_type_id=4').destroy 

如果你只想刪除與該列表關聯

ListItem.where('list_id = ?', List.find_by_list_type_id(4).id).destroy_all 

List.find_by_list_type_id(4).list_items.destroy_all 
+0

類似於後者,但得到一個錯誤 – timpone

+0

什麼是錯誤?加入上述^^ –

+0

,THX – timpone

0

試試這個時listItems:

class List < ActiveRecord::Base 
    has_many :list_items, :dependent => :delete_all 

List.where('list_type_id=4').list_items.clear 
+0

我想刪除相關項目沒有列表和相關項目 – timpone

+0

@timpone,看到更新 – megas

+0

沒有骰子 - 我想我需要一個地圖步驟 – timpone