我希望你们中的一些sql大师能够帮助我在rails中构建一个相对复杂的(无论如何对我来说)查询。我有两个相关的模型,一个故事模型和一个帖子模型。
class Story < ActiveRecord::Base
attr_accessible :title
belongs_to :user
has_many :posts,
:dependent => :nullify
class Post < ActiveRecord::Base
attr_accessible :contents
belongs_to :story, :touch => true
belongs_to :user, :touch => true
每个故事实例都充当多个post实例的包装器。我希望能够在数据库中搜索在特定时间范围内创建帖子的故事,如果有一个故事在给定时间范围内发布了帖子,则返回所有故事属性以及该故事在该时间范围内最近创建的帖子(以及所有属性)。我可以获得story属性和post_id,但我不知道如何获得其余的post属性。
这是我在Post.rb:中得到的
scope :within_user_preferred_date_range, lambda { |user|
where("posts.created_at BETWEEN ? AND ?",
(Time.now.midnight - user.preferences[:start_story_date_offset_in_days].days),
(Time.now - user.preferences[:end_story_date_offset_in_days].days )) }
####################################
def self.close_timely_posts(user)
Post.includes(:story).within_user_preferred_date_range(user).select("DISTINCT(story_id)")
end
这会生成以下sql查询,很明显,这并不是我所需要的:
←[1m←[35mPost Load (0.0ms)←[0m SELECT DISTINCT(story_id) FROM `posts` WHERE
(posts.created_at BETWEEN '2011-06-03 07:00:00' AND
'2011-06-06 19:34:40') ORDER BY posts.created_at DESC
←[1m←[36mStory Load (0.0ms)←[0m ←[1mSELECT `stories`.* FROM `stories` WHERE (`stories`.`id` IN (70,57,53,55,16,54,51,56,52,60,59,58))←[0m
如果您能提供任何有关此查询的帮助,我们将不胜感激!
尝试将代码修改为:
def self.close_timely_posts(user)
Post.includes(:story).within_user_preferred_date_range(user).select("DISTINCT(story_id), posts.*")
end