如何更有效地表达这个Ruby循环?

时间:2012-07-11 20:09:19

标签: ruby-on-rails ruby mongodb mongoid

我来自PHP世界并且对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”部分,但如果有更好的方法可以解决这个问题,我很乐意受到启发。

修改 我正在使用MongoDB和Mongoid,所以加入对我来说不是一个选择。

2 个答案:

答案 0 :(得分:4)

回答ActiveRecord(在更新问题之前,我希望仍然有用):make association:a band has_one:lead_signer,A LeadSinger belongs_to:band。现在:

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

答案 1 :(得分:3)

使用MongoId,您仍然可以使用标准进行更新:

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