Как я могу присоединиться к производной таблице? - PullRequest
4 голосов
/ 06 декабря 2011

SQL-оператор выглядит так:

select posts.id, posts.title 
from posts 
inner join (select distinct post_id,created_at  
            from comments 
            order by created_at DESC limit 5
            ) as foo 
        on posts.id=foo.post_id 
order by foo.created_at DESC; 

Я хочу получить выражение rails 3 sql, эквивалентное приведенному выше.

То, что я попробовал, дано ниже:

Следующий SQL-запрос дает аналогичный результат.

select distinct post_id, created_at  
from comments 
order by created_at DESC limit 5

@temp = Comment.select('distinct(comments.post_id),created_at').order('created_at DESC').limit(5)

Я попытался соединить эту производную таблицу @temp с таблицей posts, чтобы получить posts.title

Я попробовал это, но не получилось.

@temp2 = @temp.joins('posts')

Итак, как мне объединить таблицу сообщений с производной таблицей @temp?

                                   Table "public.posts"
   Column    |          Type          |                     Modifiers                      
-------------+------------------------+----------------------------------------------------
 id          | integer                | not null default nextval('posts_id_seq'::regclass)
 title       | character varying(100) | not null
 content     | character varying(500) | not null
 created_at  | date                   | 
 updated_at  | date                   | 
 tags        | character varying(55)  | not null default '50'::character varying
 category_id | integer                | not null default 1
Indexes:
    "posts_pkey" PRIMARY KEY, btree (id)

комментарии

                                   Table "public.comments"
   Column   |          Type          |                       Modifiers                       
------------+------------------------+-------------------------------------------------------
 id         | integer                | not null default nextval('comments_id_seq'::regclass)
 post_id    | integer                | not null
 name       | character varying(255) | not null
 email      | character varying(255) | not null
 content    | character varying(500) | not null
 created_at | date                   | 
 updated_at | date                   | 
Indexes:
    "comments_pkey" PRIMARY KEY, btree (id)

посты модель, has_many :comments, комментарии модель, belongs_to :post

1 Ответ

1 голос
/ 07 декабря 2011

Автору вопроса нужно ознакомиться с основными Rails и использованием activerecord, прежде чем переходить к SQL. Необходимо понимать, как Activerecord моделирует ваши данные и как их использовать. Сначала выясните, что вы хотите сделать на общем языке, а затем посмотрите, как вы можете использовать то, что существует для этого.

Rails не знает структуру вашей таблицы @temp. Он имеет только набор результатов, и, насколько я понимаю, AREL не строит логику из набора результатов. Он строится из схем, которые он использует для моделей активных записей.

Вы не можете построить представление из этих данных, поэтому ваш единственный вариант - использовать стандартные параметры соединения с классами activerecord или выполнить пользовательский sql.

В Rails 3 реляционная алгебра ActiveRecord очень продвинута и упрощает запросы.

Comment.order("#{Comment.table_name}.created_at desc').limit(5).joins(:posts).order("#{Post.table_name} created_at desc")

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