Итерация по массиву моделей в рельсах - PullRequest
0 голосов
/ 30 июня 2011

Еще один рубиновый вопрос, но это куча вопросов в одном.Я действительно начинаю любить рельсы, но есть некоторые вопросы, которые я просто хотел бы задать прямо.

Прямо сейчас я внедряю очередь в sqlite.У меня уже есть настройка скаффолда с этим рабочим ок.Цель состоит в том, чтобы веб-сканер прочитал массив и определил, какие ссылки он должен сканировать следующим.

Архитектура в программе 2 контроллера.один для работы и один для гусеничного.Jobs имеет стандартный интерфейс Crud, поставляемый с эшафотом.Там, где я падаю, я все еще пытаюсь понять, как эти вещи взаимодействуют друг с другом.

Задание форматируется как URL: строка и глубина: десятичное число.Таблица уже заполнена примерно 4 объектами.

@sitesToCrawl = Job.all

@sitesToCrawl.each {|x|puts Job.url}

У меня есть куча вопросов по поводу вышеупомянутого.

В данный момент это должно было отображать все задания, и я с глупостью думал, что это будет отображать простой текст, но на самом деле это шестнадцатеричный указатель на сам объект.Что я пытаюсь сделать, так это перебирать @sitesToCrawl и выдавать каждый URL-адрес Джобса.

Вопросы начинаются здесь:

1: Я знаю, что ruby ​​динамически типизирован.Будет ли @sitesToCrawl стать массивом, как я хочу, чтобы это было с каждым слотом, содержащим задание.

2: @ sitesToCrawl.each довольно прост, и я предполагаю, что это итератор.
- это имя Xod метод или какова цель символа или строки между | * |

3: Puts и print более или менее одинаковы yes?если я скажу, что @x = ставит 3, тогда x будет 3?

4: Job.url.Можно ли ссылаться на объекты таким образом, или я должен использовать

 #@sitesToCrawl = db.execute("SELECT url FROM jobs;")

, где db - новая база данных

1 Ответ

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

Как указала Рубиш Гупта, в своем блоке вы должны выполнить x.url, в противном случае вы пытаетесь получить доступ к методу url в классе Задании, а не в экземплярах работы. Другими словами, в блоках элементы в каналах являются аргументами блока, и each будет перебирать ваш массив, передавая по одному элементу за раз вашему блоку. Проверьте документ здесь.

Просто чтобы расширить эту идею, each на Hash es (ассоциативные массивы, карты, независимо от того, что вы их знаете) передаст две переменные в ваш блок: ключ и значение, например это:

a_hash.each {|key_var, val_var| puts "#{key_var} is associated with #{val_var}"}

Кроме того, прошло немного времени с тех пор, как я сделал простые модели ActiveRecord, но вы можете заняться

@sitesToCrawl = Job.all.to_a

, поскольку Job.all является ленивым искателем в том смысле, что он строит запрос в потенции: вы, по сути, создали строку запроса, говорящую SELECT * FROM jobs, но она может не выполняться пока вы не попытаетесь получить доступ к элементам. each может сделать это, я не могу вспомнить, но если вы используете отладчик, чтобы посмотреть на него, я знаю, вам нужно to_a, чтобы заставить его выполнить запрос.

Вы обязательно должны использовать job_instance.url - в этом прелесть ActiveRecord, он облегчает доступ к базе данных при условии, что все настроено правильно:)

Наконец, put и print почти одинаковы - разница в том, что puts "string" существенно print "sting"; STDOUT.flush - он сбрасывается в конце оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...