2012-07-11 50 views
0

我來自一個PHP世界,對Ruby來說很新,所以可能有更好的方法來做到這一點。用更好的代碼可以更簡潔地表達這個塊嗎?這個Ruby循環如何更有效地表達?

bands = Band.where(:type => 'Rock & Roll').only(:id) 
band_ids = bands.map &:id 

band_ids.each do |id| 
    lead_singer = LeadSinger.find(:band_id => id) 
    if lead_singer 
    lead_singer.rock_and_roll = true 
    lead_singer.save 
    end 
end 

這一切都感覺有點臃腫。如果沒有找到結果,我添加了「if lead_singer」部分,但如果有更好的方法去解決這個問題,我很樂意開悟。

編輯 我在Mongoid中使用MongoDB,所以連接不會成爲我的選擇。

+1

'LeadSinger.find(Band.where(:類型=>「搖滾).pluck(: id))。update_all(:rock_and_roll => true)' – MurifoX 2012-07-11 20:16:33

回答

3

隨着MongoId你應該仍然能夠與指標分析更新:

LeadSigner.where(:band_id.in => band_ids).update(:rock_and_role => true) 
+0

您是否應該在此添加多標誌? – 2012-07-11 20:19:38

+0

使用scope.update,mongoid應該設置多標誌本身。 – gmalette 2012-07-11 20:22:57

+0

啊,這是新的版本:) – 2012-07-11 20:24:36

4

ActiveRecord的答案(問題更新之前,我希望仍然有用):make associations:band has_one:lead_signer,LeadSinger belongs_to:band。現在:

LeadSinger.joins(:band).where(:"bands.type" => 'Rock & Roll'). 
    update_all(:rock_and_roll => true) 
+0

我喜歡update_all,但我應該提到我在使用MongoDB w/Mongoid並且不能使用連接 – jbnunn 2012-07-11 20:13:50

+0

@jnunn:如果你不提及ORM它被假定爲AR。然後更新問題。不過,我沒有使用MongoDB的經驗。 – tokland 2012-07-11 20:16:05

+0

感謝@tokland,它現在已經更新 - 仍然在提高您的答案 – jbnunn 2012-07-11 20:16:22