Добавление в массив в Ruby on Rails - PullRequest
1 голос
/ 28 января 2011

В настоящее время я пишу функцию ruby, которая получает таблицу из базы данных, а затем на основе данных создает массив. Это написано так:

  def listSome
    @foos = Array.new
    FooTable.find(:all) do |foo|
      @foos << foo if foo.name == "Bar"
    end
  end

Проблема в том, что в массив добавляется только первый элемент запроса. Я проверил, что FooTable.find (: all) возвращает то, что, я думаю, должно быть в консоли, а также, что можно зацикливать его результаты (я напечатал результаты в каждом цикле, он нашел то, что искал). Однако я подозреваю, что в конкатенации с массивами / коллекциями есть что-то, чего я не понимаю. Почему я получаю только первый результат запроса, добавленный в мой массив? Спасибо.

Ответы [ 2 ]

8 голосов
/ 28 января 2011

Вы предоставляете блок для метода find, который не будет запускать его для каждого элемента массива, который он возвращает.Предоставьте свой блок методу each, возвращаемому find.

FooTable.find(:all).each { |foo| ... }

Кроме того, если предположить, что это реальный код, а не пример, существует очень плохой способ получения foos с определенным именем.

рельсы 2

@foos = FooTable.find(:all, :conditions => ['name = ?', 'Bar'])

рельсы 3

@foos = FooTable.where('name = ?', 'Bar')
0 голосов
/ 28 января 2011

Вы забыли each: FooTable.find(:all).each do |foo|.

Но я бы сделал еще несколько комментариев, вы должны использовать больше map/select/reject/inject и меньше each:

def listSome
  @foos = FooTable.find(:all).select do |foo|
    foo.name == "Bar"
  end
end

Но всякий раз, когда это возможно, используйте больше SQL и меньше Ruby:

def listSome
  @foos = FooTable.where(:name => "Bar")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...