Помогите построить сложный запрос БД в рельсах - PullRequest
0 голосов
/ 07 июня 2011

Я надеюсь, что некоторые из вас, гуру 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_id, но не могу понять, как получить остальные атрибуты записи.

Вот что я получил в 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

Любая помощь, которую вы можете оказать с этим запросом, будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 июня 2011

Попробуйте изменить свой код на:

  def self.close_timely_posts(user) 
    Post.includes(:story).within_user_preferred_date_range(user).select("DISTINCT(story_id), posts.*")   
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...