0

我有一个模型用户,其中有很多照片。

我需要获取用户提要(其他用户的照片,应包括用户),因此查询将是:

Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).joins(:user)

但我只得到照片,没有用户信息。是否可以进行返回如下内容的查询:

({user:{},photo:{}},{user:{},photo:{}},{user:{},photo:{}})
4

2 回答 2

3

这里需要理解的重要一点是,通过使用包含,rails 直接从数据库中返回原始模型(在本例中为照片),但也会将所有关联的用户模型加载到内存中,这些模型可以通过照片进行查询。这种方法假设 DB 查询时间很昂贵,并且花费内存空间/CPU 时间更有效。

实际上,这意味着在您执行查询之后:

@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user)

你可以运行:

@photos.first.user

这不会为用户进入数据库,而是从内存中加载(这被认为很便宜)。因此,当您需要照片的用户时,您只需运行它的user方法即可,您不必在({user:{},photo:{}},{user:{},photo:{}},{user:{},photo:{}})结构中预先组织它 - 只需在需要时加载用户即可。

如果由于某种原因您必须以这种特定方式组织它,您可以:

@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user)

@photos = @photos.map {|p| {:user => p.user, :photo => p}

这将返回一个包含照片和用户哈希的数组。

于 2012-09-11T18:11:32.080 回答
0

根据您的评论,您可能需要一级链接查询,因为应该按照您的原始帖子将结果传递给另一种方法。这是完全未经测试的,但我认为这是您需要实现的方向。这个想法是你得到当前用户是追随者的所有关系对象。然后你包括用户对象,命名为追随者。belongs_to根据您在关系模型中定义的方式,可能需要更改该符号。从那里你包括照片。

根据生成的查询,它可能会引发错误。如果是这样,请将符号切换为字符串,并指定表名。如果您在尝试此操作时遇到错误,请使用堆栈跟踪编辑您的问题。

Relationship.where(:follower_id => user.id).includes(:follower).includes(:photos)
于 2012-09-11T17:17:40.397 回答