Это хороший способ получить произвольные данные из БД - PullRequest
1 голос
/ 08 июня 2011

Что вы хотите создать специальный запрос вручную, не основываясь на какой-либо конкретной модели.Столбец здесь, столбец там, может быть, счет, сумма или какой-то другой расчет.Вот способ, которым я придумал ...

>> results = ActiveRecord::Base.connection.execute(
    'SELECT location, count(*) AS count FROM contracts 
    GROUP BY location 
    ORDER BY location')
=> #<Mysql::Result:0x103197e50>
>> arr = []
=> []
>> results.each { |row| arr << [row.first, row.last] }
=> #<Mysql::Result:0x103197e50>
>> arr
=> [[nil, "189"], ["", "4"], ["Canceled", "12"], ["Cancelled", "4"], ["Closed", "1"], ["Contract - Asst", "4"], ["Contracts - Admin", "5"], ["Exec - Operations", "2"], ["Exec - Policy", "1"], ["Executive", "1"], ["Finance", "25"], ["Fully Executed", "3631"], ["General Counsel", "11"], ["On-Hold", "27"], ["Pending Distribution", "2"], ["Pending Signature", "40"], ["Per Stephen W.", "1"], ["Project Manager", "26"], ["Upcoming", "1"]]

Но я как худший программист когда-либо.Как бы это сделал хороший программист?

В частности, есть ли более чистый и простой способ доступа к данным в объекте Mysql::Result?Почему я получаю Mysql::Result вместо некоторой обобщенной, не относящейся к БД структуры данных?

(Если это имеет значение, в этом конкретном случае я буду использовать 2d Array для заполнения меню выбора,но это может быть что угодно.)

1 Ответ

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

Для запуска пользовательских SQL-запросов через ActiveRecord существует два основных подхода:


1) ActiveRecord::Base#find_by_sql ( документы )

Пример (взят из документации):

Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
> [#<Post:0x36bff9c @attributes={"first_name"=>"The Cheap Man Buys Twice"}>, ...]

2) ActiveRecord::Base.connection.select и ActiveRecord::Base.connection.select* ( документы )

Преимущество использования этого заключается в том, что вы получаете обычные Hash объекты, которые легко анализировать.


ВАЖНОЕ ПРИМЕЧАНИЕ : убедитесь, что вы очищаете свои запросы перед использованием этих методов, иначе вы будете открыты для атак SQL-инъекцией !! (Да, это заслуживает ДВА восклицательных знака!)


Редактировать : взгляните на Поддержка запросов ActiveRecord (работает на Arel ), если вы еще этого не сделали. С этим можно многое сделать.

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