2010-05-13 46 views
0

我有一個has_many通過令人沮喪的問題:即通過模型,直到保存創建的事實。不幸的是,我需要在保存父項之前在這些模型上設置數據。Ruby on Rails:has_many通過挫折

這裏的鬆設置:

class Wtf < ActiveRecord::Base 
    belongs_to :foo 
    belongs_to :bar 
end 

class Bar < ActiveRecord::Base 
    has_many :wtfs 
    has_many :foos, :through => :wtfs 
end 


class Foo < ActiveRecord::Base 
    has_many :wtfs 
    has_many :bars, :through => :wtfs 

    def after_initialize 
    Bar.all.each do |bar| 
     bars << bar 
    end 
    end 

end 

一切都只是我需要訪問 「跆拳道」 的優良之前保存:

F = Foo.new = >#

f.bars => [酒吧列表]

這裏

f.wtfs => []

f.save空單! =>真

現在我得到的東西

f.wtfs => [東西名單]

我還跟那麼遠,明確地創建這樣做的wtfs:

def after_initialize 
    Bar.all.each do |bar| 
     wtfs << Wtf.new(:foo => self, :bar => bar, :data_i_need_to_set => 10) 
    end 
    end 

這會導致f.wtfs被填充,但不是條形。當我保存並檢索時,我獲得了預期wtfs的兩倍。

任何人有任何想法?

+0

在Foo保存並給出ID之前,Wtf應該如何保存並與Foo關聯? – jdl 2010-05-13 20:19:21

回答

2

我認爲你有正確的想法直接創建Wtfs。我認爲,如果你剛纔設置的酒吧在同一時間它會變成OK:

def after_initialize 
    Bar.all.each do |bar| 
    wtfs << Wtf.new(:bar => bar, :data_i_need_to_set => 10) # Rails should auto-assign :foo => self 
    bars << bar 
    end 
end 

導軌應該正確保存記錄,因爲它們是對象的同一集合。唯一的障礙可能是,如果鐵軌沒有智能來檢查在酒吧集合已經有有一個Wtf關聯新的Bar記錄,它可能會創建一個。試試看。

+0

謝謝,是的,它是正確的,我會添加你的分配吧 這裏是問題: after_initialize將啓動每次Foo實例化時,我只需要它啓動時,我創建一個新的一。所以我會加入這個功能的開始。 返回除非self.new_record? – 2010-05-14 14:43:46

+0

是的,這可能是你最好的選擇,雖然我可能會建議在名爲'new_with_bars'的模型上創建一個類方法,創建一個新記錄並分配條和wtfs – 2010-05-14 21:29:11

+0

這是一個非常有用的方法,但要小心,如果你從'foo.bars'中刪除,它不會刪除相關的'wtf' – SooDesuNe 2011-09-06 03:13:33

1

難道你不能在Wtf上寫一個before_save處理程序來設置你需要設置的數據嗎?如果需要,它可以訪問foo和bar。

+0

是的,這將工作,但我需要顯示Wtf數據用於覆蓋。 – 2010-05-14 14:44:55

1

你可以設置填充條的after_create,像這樣的方法:

class Foo < ActiveRecord::Base 
    has_many :wtfs 
    has_many :bars, :through => :wtfs 
    after_create :associate_bars 

    def associate_bars 
    Bar.all.each do |bar| 
     bars << bar 
    end 
    end 
end 

這將使此方法時,被稱爲是已經創建的wtfs。

+0

我試過使用after_create,這似乎只在我做了foo.save後纔開始。在Foo.new之後,我想要顯示Wtf數據並允許用戶混淆 – 2010-05-14 14:48:19

+0

另外,我非常喜歡創建「associate_bars」方法的想法,我肯定會實現這一點。它比我所擁有的清潔得多。 – 2010-05-14 17:01:29