2016-02-13 3 views
0

У меня есть таблица под названием invoices и invoicesbelongs_to :subscription и subscriptionbelongs_to :user. A userhas_many :licenses. Мне нужны два запроса: каждый получает invoices, у которого было licenses, созданное в течение определенного периода времени, так что те licenses не имеют определенного viewership_id.Комплексные соединения ActiveRecord

Я был в состоянии получить этот запрос правильно, вот это:

Invoice.joins(
    subscription: { 
    user: :licenses 
    } 
).where(
    # Other licenses during date range 
    licenses: { 
    created_at: date_range 
    } 
).where.not(
    licenses: { 
    viewership_id: Viewership.member.tier(1).first.id 
    } 
) 

Теперь мне нужен запрос, который получает все invoices, которые не имеют каких-либо лицензий, созданных в течение определенного периода времени. Нечто подобное (хотя это не работает):

Invoice.includes(
    subscription: { 
     user: :licenses 
    } 
).where(
    licenses: { 
     user_id: nil, 
     created_at: date_range # <-- removing this works, but is an incorrect query, 
          # because the user may have created other 
          # licenses outside of this date_range and 
          # that's alright--so querying without the 
          # date_range means i may miss some users who 
          # have licenses that just weren't created in 
          # the date_range 
    } 
) 
+0

Мне сложно определить, что именно вы хотите, особенно с этим комментарием. Это может помочь, если вы можете создать небольшую визуальную таблицу лицензий, которая показывает, чего вы пытаетесь достичь. Я также немного озадачен - если вы хотите, это лицензии, почему бы вам не начать запрос с лицензии? – max

+0

@max Я сказал, что мне нужно количество счетов-фактур, а не лицензий. Попробую написать диаграмму – trevorhinesley

+0

Извините, мой плохой. Рассматривали ли вы настройку менее тангенциальной связи между фактурой и лицензией? Тот факт, что вы присоединяетесь к 3 таблицам вниз, походит на настоящий запах кода, кроме того, что он медленный. – max

ответ

0

Может быть, это поможет вам

# Create a date range 
from_date = 1.months.ago 
to_date = Time.now 

@invoices = Invoice.joins(subscription: [user: :licenses]).where("licenses.created_at BETWEEN ? AND ? AND licenses.viewership_id !=?", from_date, to_date, Viewership.member.tier(1).first.id) 

Для получения всех invoices, которые не имеют каких-либо лицензий, созданных в течение определенного периода времени.

@invoices = Invoice.includes(subscription: [user: :licenses]).where("licenses.created_at NOT BETWEEN ? AND ?", from_date, to_date) 
+0

Это запрос, который у меня уже был правильный, второй запрос, который я перечислял, был тем, который я не могу получить правильно. Спасибо tho – trevorhinesley

+0

Ох ... Мой плохой. В этом случае вы можете искать 'Invoices' by' license.created_at' не между заданным диапазоном дат. Я обновляю ответ. –

+0

Этот запрос увидит, нет ли каких-либо лицензий, созданных в течение этого периода, но он не будет проверять, не имеет ли вообще никаких лицензий. Мне нужно найти те, у которых либо нет каких-либо лицензий, либо есть некоторые, которые не были созданы между этими датами – trevorhinesley

Смежные вопросы