Ярлык для указания порядка и лимита при доступе к отношению has_many? - PullRequest
3 голосов
/ 29 ноября 2008

Существует ли ярлык для задания ограничения и порядка при доступе к отношению has_many в модели ActiveRecord?

Например, вот что я хотел бы выразить:

@user.posts(:limit => 5, :order => "title")

В отличие от более длинной версии:

Post.find(:all, :limit => 5, :order => "title", :conditions => ['user_id = ?', @user.id])

Я знаю, что вы можете указать это непосредственно в отношении has_many, но есть ли способ сделать это на лету, например, показать 10 сообщений на одной странице, но только 3 на другой?

Ответы [ 3 ]

8 голосов
/ 29 ноября 2008

У меня что-то похожее в модели блога:

  has_many :posts, :class_name => "BlogPost", :foreign_key => "owner_id",
    :order => "items.published_at desc", :include => [:creator] do
      def recent(limit=3)
        find(:all, :limit => limit, :order => "items.published_at desc")
      end
  end

Использование:

Blog.posts.recent

или

Blog.posts.recent(5)
3 голосов
/ 29 ноября 2008

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

class Post < ActiveRecord::Base
  named_scope :limited, lambda {|*num| {:limit => num.empty? ? DEFAULT_LIMIT : num.first}}
end

Это, в сущности, похоже на utility_scopes, как сообщает @Milan, за исключением того, что вы делаете это по частям, только там, где вам нужно это сделать.

1 голос
/ 29 ноября 2008

Вы можете использовать Ryan Daigle utility_scopes . После установки (это драгоценный камень) вы получите несколько новых полезных областей, таких как:

@user.posts.ordered('title ASC').limited(5)

Вы можете даже установить порядок и лимит по умолчанию для любой модели.

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