Как найти самые последние ассоциации, созданные между двумя объектами с Rails? - PullRequest
2 голосов
/ 16 марта 2010

У меня есть модель user, модель movie и эта ассоциация в user.rb (я использую has_many: through, поскольку между этими двумя моделями существуют другие ассоциации):

has_many: has_seens
has_many: movies_seen,: through =>: has_seens,: source =>: movie

Я пытаюсь получить массив из десяти самых последних созданных has_seens ассоциаций.

На данный момент единственное решение, которое я нашел, - это просканировать всех пользователей, создать массив с каждым найденным user.has_seens, затем отсортировать массив по has_seen.created_at и сохранить только последние 10 элементов ... Похоже, тяжелая операция .

Есть ли лучший способ?

Кевин

Ответы [ 2 ]

1 голос
/ 16 марта 2010

Этого можно добиться, добавив предложение :order к ассоциации has_many :has_seens, чтобы упорядочить их по дате создания. Затем используйте расширение ассоциации, чтобы определить метод для самой ассоциации:

class User < ActiveRecord::Base
  has_many :has_seens, :order => 'created_at DESC' do
    def recent(count=10)
      all(:limit => count)
    end
  end
end

Теперь вы можете использовать user.has_seens.recent для просмотра последних десяти фильмов. При желании, введите другой счет, например, user.has_seens.recent(25).

Между прочим, я думаю, что viewings является менее неловким именем ассоциации, чем has_seens!


Редактировать : Лично я бы все устроил с помощью Viewing модели соединения, например:

class User < ActiveRecord::Base
  has_many :viewings
  has_many :movies, :through => :viewings
end

class Viewing < ActiveRecord::Base
  belongs_to :user
  belongs_to :movie

  default_scope :order => 'created_at DESC'

  # Recent n viewings for any user  
  named_scope :recent, lambda { |count| { :limit => count }} 
end

class Movie < ActiveRecord::Base
  has_many :viewings
  has_many :users, :through => :viewings
end

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

Теперь вы можете сделать:

# 10 most recent viewings for everyone
recent = Viewing.recent(10)
0 голосов
/ 16 марта 2010

Вы можете сделать это, используя find:

HasSeen.find(:order => 'created_at DESC', :limit => 10)

Вы можете использовать named_scope (внутри модели HasSeen) следующим образом:

named_scope :recent, :order => 'created_at DESC', :limit => 10

и звоните HasSeen.recent.

Если вы ищете пользователей, простой (но не самый эффективный, я просто не знаю точно, как выполнить объединение) способ сделать это - recent_users = HasSeen.recent.map { |h| h.user }

Если последнее - то, что вы ищете, оставьте комментарий, и я уберу его в named_scope для модели пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...