2013-10-14 3 views
0

Я использую RoR для разработки приложений и хочу реализовать следующее:Rails - получить последние данные из нескольких таблиц

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

Снять последние n записей из одной таблицы базы данных легко, но как вытащить последние n записей по нескольким таблицам базы данных.

Любые предложения?

ответ

0

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

Вы можете попробовать что-то вроде этого, его не совсем то, что вы хотите, хотя:

@all_items = [@record_videos.all, @musics.all, @new_topics.all].flatten.sort_by{ |thing| thing.created_at} 

взяты из: rails 3 merge multiple queries from different tables

Если это важно для вас, то истинный путь для достижения этой цели в Rails заключается в использовании STI (однонаправленное наследование). Но это потребует реструктуризации вашей БД и моделей.

+0

Привет, спасибо за указывающей в этом направлении. Вариант использования заключается в том, что мне нужно получить записи базы данных для публикации в ленте RSS и вам нужно сравнить запись на основе времени создания для нескольких таблиц. –

0

Для этого нет встроенных методов в ActiveRecord, очень просто сделать это в SQL. Просто выполните UNION.

SELECT * FROM (
    SELECT table1.*, 'table_1_type' AS table_type FROM table1 
    UNION ALL SELECT table2.*, 'table_2_type' AS table_type FROM table2 
    UNION SELECT table3.*, 'table_3_type' AS table_type FROM table3 
) AS my_union ORDER created_at DESC LIMIT 10; 

Этот запрос возвращает 10 строк, каждая строка будет иметь таблицы от каждого из них. Я предлагаю вам создать простой класс Ruby, который выполняет этот необработанный запрос и перестраивает объекты. Или еще лучше просто получить нужные вам значения и представить их с помощью простых классов Ruby (не используя модели You).

Вы можете получить доступ к Postgres соединения через любой класс AR, как этот MyModelClass.connection Пример использования сырого соединения:

conn = MyModelClass.connection 
res = conn.exec('select tablename, tableowner from pg_tables') 

res.each do |row| 
    row.each do |column| 
    puts column 
    end 
end 

В этом же образом можно выполнить Ваш запрос и заполнить объекты Ruby.

UPD

Существует также третий вариант можно использовать. Создайте новую модель RssItem и верните ее с представлением SQL вместо таблицы. Подход объясняется в этом посте:

http://hashrocket.com/blog/posts/sql-views-and-activerecord

Смежные вопросы