2015-02-17 5 views
1

Таблица My Product имеет несколько версий каждого продукта в разные сроки.Rails 4 (arel?) Присоединяться к подзапросу

Я хочу найти каждый макс (дата), сгруппированный по версии_id. И я хочу ActiveRecord :: Отношение строк, соответствующих этой максимальной дате и version_id.

в приложение/модели/product.rb:

def self.latest_versions 
     select("max(date) as max_date"). 
     select("version_id"). 
     group("version_id") 
    end 

Как я присоединяюсь продукт с этой «временной таблицы», чтобы получить все продукты, соответствующие даты и версии иды вернулся? Я, очевидно, не могу выбрать: id в приведенном выше методе, поскольку это не столбцы Group By.

Фактический сценарий более сложный, но, возможно, мне не хватает базового принципа, который подпадает под этот упрощенный сценарий?

ответ

2
def self.latest_versions 
    t = Product.arel_table 

    subquery = t. 
    project(
     t[:date].maximum.as("max_date"), 
     t[:version_id] 
    ). 
    group(t[:version_id]). 
    as('subquery') 

    Product. 
    joins(Arel::Nodes::InnerJoin.new(subquery, 
      Arel::Nodes::On.new(
      t[:version_id].eq(subquery[:version_id]).and(
      t[:date].eq(subquery[:max_date]))))) 
end 
+0

Отлично! Я пытался использовать «join (subquery, Arel :: Nodes :: OuterJoin)» (что-то было предложено в другом месте), но у него возникли проблемы с навигацией по этому вопросу. Rails (или что-то еще) будет жаловаться на то, что не сможет посетить 'SelectManager' и другие связанные объекты (в зависимости от того, какая перестановка моих неудачных попыток кодирования я был;)) – Volte