2013-11-01 2 views
0

Представьте, что доска объявлений содержит User s каждый has_manyPost s.Rails scope to go 'up' a has_many relation

У меня есть область, которая возвращает мне кучу Post s, и мне хотелось бы перейти оттуда к набору User.

Я мог бы просто перебирать, и для каждого Post, добавляющий свои User к соотношению, то DeDupe в User с, но должно быть проще, нет?

+0

Является ли это в вашем контроллере или посмотреть? Не могли бы вы разместить свой код? –

+0

Ну, я писал это на мой взгляд, но я не думаю, что это сильно изменило бы ситуацию. Поэтому я хочу что-то вроде 'Posts.where ('created_at>?', Time.now - 1.day) .users'. , , – isthmuses

+0

Вы действительно не должны иметь такой код в своем представлении, он принадлежит вашему контроллеру. Также ассоциация, которую вы только что писали, должна делать то, что вы ищете –

ответ

1

Вы должны присоединиться к этим двум таблицам: В моем примере я предполагаю, что вы хотите, чтобы получить все имена пользователей, которые размещены в последние 24 часа:

# joining posts with users 
Post.joins(:user) 

    # filtering all posts that are older than 1 day 
    .where("posts.created_at > ?", Time.now - 1.day) 

    # selecting every user only once 
    .select("users.id").uniq 

    # then selecting the fields you want to work with 
    .select("users.name") 
1

Posts.where ('created_at>?', Time.now - 1.day) .map (&: пользователь) .uniq

сообщений запрос будет возвращать набор сообщений. Вам нужно сопоставить эти сообщения с пользователем, а затем усечь набор для уникальных пользователей (потому что сообщение может принадлежать одному пользователю).

С жадным загрузки:

Posts.where - .includes (, Time.now 1.day 'created_at>?) (: Пользователь) .map (&: пользователь) .uniq

Этот вам не придется делать запрос каждый раз, когда вы пытаетесь и вытаскиваете пользователя из сообщения.

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