2016-02-01 3 views
0

АссоциацияЗапрос на has_many через рельсы

class Campaign 
    has_many :views_logs 
    has_many :users, through: :views_logs 
end 

Я хочу, чтобы все users в Campaign в каких-либо конкретных дат и т.д. смысл, я хочу сделать что-то вроде: Campaign.first.users.where(?)

Теперь, когда Я запрашиваю:

Campaign.first.users.all 

Я получаю список всех пользователей в рамках определенной кампании , но как я могу получить только тех пользователей, у которых есть Кампания между определенными диапазонами дат.

+0

Каково название столбцов даты и в какой модели они есть? –

+0

Я не могу понять ваш вопрос. Нежелательно ellaborate –

+0

* конкретные диапазоны дат *, по которым столбцы? Являются ли они стандартными столбцами даты create_at/update_at или любыми настраиваемыми столбцами даты, которые у вас есть? В какой модели эти столбцы доступны? –

ответ

1

I want to get all users in a Campaign within any specific dates

ActiveRecord Association Extension:

#app/models/campaign.rb 
class Campaign < ActiveRecord::Base 
    has_many :users, through: :view_logs do 
     def between start_date, end_date 
     where(created_at: start_date..end_date) 
     end 
    end 
end 

@campaign = Campaign.find x 
@users = @campaign.users.between(Date.today - 2, Date.today.day) 

-

Update - это кажется PGSQL требует timestamp оценить даты:

@users = @campaign.users.between(Time.now.midnight - 2.days, Time.now.midnight) 

Разница в том, что между Date & Time объектов.

+0

PG :: UndefinedFunction: ERROR: оператор не существует: отметка времени без часового пояса <= целое LINE 1: ... ogs "." Campaign_id "= $ 1 AND (" users ". "created_at" BETWEEN '2 ... –

+0

Не могли бы вы разместить полный запрос после 'BETWEEN 2'? Спасибо! –

+0

Query is Campaign.first.users.between (Date.today - 2, Date.today.day) –

1

Вы пробовали делать:

Campaign.first.users.where("campaigns.created_at > #{start_date} AND campaigns.created_at < #{end_date}") 
2

Просто определить область в User, как это:

class User < ActiveRecord::Base 
    # Your current code 
    scope :during_campaign, -> (start, end) { 
     joins(view_logs: :campaign).where('campaigns.created_at >= ? AND campaigns.created_at <= ?', start, end) 
    } 

end 

Затем использовать:

# User from yesterday compaign for eg 
User.during_campaign(1.day.ago, Time.now) 

Сделать это родовое & довольно всегда!

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