的Ruby-on-Rails的:如何从一个数据库表中的一个有限的子集拉出最近条目(Ruby-on-R

2019-10-20 04:22发布

想象一下,像谁拥有很多朋友,每个谁有很多评论,在这里我想向用户显示他的朋友们的最新100个注释的模式用户。

是否有可能绘制出一个SQL查询最新的100,还是我将不得不使用Ruby应用程序逻辑来分析一个更大的列表或进行多次查询?

我看到的要对此有两种方法:

  1. 开始User.find和使用一些复杂的组合:加入和:限制。 这种方法似乎是有前途的,但不幸的是,会回到我的用户,而不是评论,一旦我得到这些回来,我有很多的模型占用内存(每个朋友和用户),转移大量不必要的字段的(一切对于用户来说,和这个名字排为好友的一切),我仍然不得不步莫名其妙地收集,整理所有应用程序逻辑的意见。
  2. 起始于评论和使用某种的find_by_sql的,但我似乎无法找出我需要把我不知道你怎么可能有必要的信息传递与此限制它仅看通过朋友提出的意见。

编辑 :我有一些困难越来越EMFI的解决方案的工作,并希望任何有识之士任何人都可以提供。

朋友是通过一个连接表的循环关联。

has_many :friendships
has_many :friends, 
         :through => :friendships,
         :conditions => "status = #{Friendship::FULL}"

这是我收到的相关部分的错误:

错误:列users.user_id不存在

: SELECT "comments".* FROM "comments"  INNER JOIN "users" ON "comments".user_id = "users".id    WHERE (("users".user_id = 1) AND ((status = 2)))

当我刚进入user.friends,和它的作品,这是它执行查询:

: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))

因此,它好像它重整的:通过有两个:通过在一个查询。

Answer 1:

鉴于以下关系:

class User < ActiveRecord::Base
  has_many :friends           
  has_many :comments

  has_many :friends_comments, :through => :friends, :source => :comments
end

该语句将执行一个SQL语句。 协会主要创建名为不会被评估,直到链的末端为你的作用域。

@user.friends_comments.find(:limit => 100, :order => 'created_at DESC')

如果这是一个常见的查询,查找可以简化到它自己的范围。

class Comments < ActiveRecord::Base
  belongs_to :user

  #named_scope was renamed to scope in Rails 3.2. If you're working
  #if you're working in a previous version uncomment the following line.
  #named_scope :recent, :limit => 100, : order => 'created at DESC'
  scope :recent, :limit => 100, :order => 'created_at DESC'
end

所以现在你可以这样做:

@user.friends_comments.recent

注:用户的朋友关联可以是周期性的,通过一个连接表,但是这不是该解决方案非常重要。 只要朋友是在用户工作协会,前面会工作。



文章来源: Ruby-on-Rails: How to pull out most recent entries from a limited subset of a database table