2011-06-17 74 views
1
baza_managers = BazaManager.find(:all, 
    :conditions => ["or_unit_id != ?", 1]).collect { 
     |mou| [mou.email, mou.or_unit_id]} 

respondent_emails = Respondent.find(:all).collect {|r| r.email } 

錯誤:如何在Rails中收集?

from lib/scripts/baza_sync.rb:26:in `each' 
from lib/scripts/baza_sync.rb:26 

26線↓

baza_managers.each do |moi| 
    if !respondent_emails.include?(moi) 
    Respondent.create(:email => moi, :user_id => 1, :respondent_group_id => moi) 
    end 
end 

錯誤,我得到:

undefined method `email' for ["[email protected]", 8]:Array (NoMethodError) 

我不知道爲什麼我得到這個錯誤。

+0

哪行做了錯誤信息點? – Gareth 2011-06-17 08:25:05

+0

我們不知道在哪一行發生錯誤,請添加它。此外,在提問時重寫一段代碼可能會更好,然後我們將能夠快速理解它,應用程序中的複製/粘貼代碼通常要複雜得多,需要來自想要回答您的人的努力(所以你得到更少的答案)。 – 2011-06-17 08:26:44

+0

對不起,我更新了我的問題。 26行(baza_managers .... end)< - 在這部分代碼中,我得到錯誤! – 2011-06-17 08:28:14

回答

1

嘗試:

baza_managers = BazaManager.find(:all, 
    :conditions => ["or_unit_id != ?", 1]).collect { 
     |mou| [mou.email, mou.or_unit_id]} 

respondent_emails = Respondent.find(:all).collect {|r| r.email } 

baza_managers.each do |moi| 
    if !respondent_emails.include?(moi[0]) 
    Respondent.create(:email => moi[0], :user_id => 1, :respondent_group_id => moi[1]) 
    end 
end 
+0

workign完美謝謝! – 2011-06-17 08:39:13

1

用以下解決您的代碼:

if !respondent_emails.include?(moi[0]) 
    Respondent.create(:email => moi[0], :user_id => 1, :respondent_group_id => moi[1]) 
end 
+0

workign完美謝謝! – 2011-06-17 08:40:16

1

我認爲至少有一個錯誤不是你正在使用collect的方式,但在你寫的邏輯在通過baza_managers陣列時最後一行。

這段代碼的條件respondent_emails.include?(moi)將永遠假的,因爲respondent_emails是電子郵件地址的數組,但moi就像["[email protected]", 8]數組所以他們永遠不會匹配。

我覺得這個錯誤讓你做該行的錯誤:

Respondent.create(:email => moi, :user_id => 1, :respondent_group_id => moi) 

因爲這條線將被計算爲(例如):

Respondent.create(:email => ["[email protected]", 8], :user_id => 1, :respondent_group_id => ["[email protected]", 8]) 

這可能不是你想要的。

最後,我建議你閱讀the debugger rails guide,我經常用調試器來弄清楚這種代碼和錯誤在哪裏以及是什麼問題。

+0

非常感謝!我會讀這 – 2011-06-17 08:39:58

1

如下我將重寫代碼:

baza_managers = BazaManager.all(:conditions => ["or_unit_id != ?", 1]). 
        collect { |mou| [mou.email, mou.or_unit_id]} 

respondent_emails = Respondent.find(:all).collect {|r| r.email } 

baza_managers.each do |email, unit_id| 
    unless respondent_emails.include?(email) 
    Respondent.create(:email => email, :user_id => 1, 
     :respondent_group_id => unit_id) 
    end 
end 

該解決方案可以通過使用OUTER JOIN檢測丟失Respondents

BazaManager.all(
    :include => "OUTER JOIN respondents A ON baza_managers.email = A.email", 
    :conditions => ["baza_managers.or_unit_id != ? AND A.id IS NULL", 1] 
).each do |bm| 
    Respondent.create(:email => bm.email, :respondent_group_id => bm.or_unit_id, 
    :user_id => 1) 
end   

該解決方案將進一步優化可以通過添加associations作出優雅和最優和named_scope

class BazaManager 

    has_many :respondents, :foreign_key => :email, :primary_key => :email 

    named_scope :without_respondents, :include => :respondents, 
    :conditions =>["baza_managers.or_unit_id != ? AND respondents.id IS NULL", 1] 

end 

現在named_scope可以用如下:

BazaManager.without_respondents.each do |bm| 
    Respondent.create(:email => bm.email, :respondent_group_id => bm.or_unit_id, 
    :user_id => 1) 
end   
+0

workign完美謝謝! – 2011-06-17 08:40:51

+0

我認爲這應該是更好的解決方案,因爲它比解決方案更具可讀性@Tudor Constantin給出了使用索引的數組 – 2011-06-17 08:44:51

+0

我已經添加了第二個解決方案看一看。 – 2011-06-17 08:47:13