【问题标题】:How can i join with a derived table?如何加入派生表?
【发布时间】:2011-12-06 16:20:11
【问题描述】:

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)

cmets

                                   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,cmets 模型,belongs_to :post

【问题讨论】:

  • 在 rails 3 中不使用 find_by_sql 就没有任何选择吗?

标签: sql ruby-on-rails ruby-on-rails-3 postgresql ruby-on-rails-3.1


【解决方案1】:

问题作者在开始学习 SQL 之前需要阅读基本的 Rails 和 activerecord 用法。需要了解 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")

【讨论】:

  • 那我怎样才能加入派生表呢?可以发一下rails way sql语句吗?
  • 我不明白你的整个模型结构。它只是与 cmets 的帖子吗?您是否正确设置了 has_many、belongs_to?看来您不必自己进行连接。如果必须,您是否检查了 rails join 文档? guides.rubyonrails.org/…
  • 我已经更新了原始帖子/问题。再看一遍就明白了。
  • 我已经更新了原始帖子/问题。再看一遍就明白了。我正在尝试获取与此等效的 rails 3 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 对象中得到什么?请用英语而不是 SQL 解释您要实现的目标。最近的 cmets 的帖子最近排在前面吗?如果是这样,那么您是否尝试过 rails 方法? Rails 3 有很多魔力。 Comment.order('comments.created_at desc').limit(5).join(:posts).order('posts created_at desc') 可以通过观察控制台检查 SQL 或在末尾加上.to_sql。基本上 Rails 3 让它变得太容易了。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2016-11-05
  • 2019-11-29
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多