Как собрать в Rails? - PullRequest
1 голос
/ 17 июня 2011
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 }

ОШИБКА:

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

ОШИБКА I GET:

undefined method `email' for ["vadasd@test.test.com", 8]:Array (NoMethodError)

Донне знаю, почему я получаю эту ошибку.

Ответы [ 4 ]

1 голос
/ 17 июня 2011

Я бы переписал ваш код следующим образом:

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        
1 голос
/ 17 июня 2011

Исправьте ваш код следующим образом:

if !respondent_emails.include?(moi[0])
  Respondent.create(:email => moi[0], :user_id => 1, :respondent_group_id => moi[1])
end
1 голос
/ 17 июня 2011

Я думаю, что есть хотя бы одна ошибка не в том, как вы используете collect, а в логике, которую вы пишете в последних строках, когда проходите массив baza_managers.

При этомВ коде условие respondent_emails.include?(moi) всегда будет ложным, поскольку respondent_emails - это массив адресов электронной почты, но moi - это массив, подобный ["vadasd@test.test.com", 8], поэтому они никогда не будут совпадать.

Я думаю, что эта ошибка заставила вас совершитьошибка в строке:

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

Поскольку эта строка будет оцениваться как (например):

Respondent.create(:email => ["vadasd@test.test.com", 8], :user_id => 1, :respondent_group_id => ["vadasd@test.test.com", 8])

Что, вероятно, не то, что вы хотите.

Наконец, я бы посоветовал вам прочитать руководство по отладочным рельсам , я часто использую отладчик, чтобы выяснить, где и в чем проблема такого рода кода и ошибок.

1 голос
/ 17 июня 2011

попробуйте с:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...