У меня есть has_many отношения, и я хочу установить пользовательский предел и сместить. а также считать их

Hy,

Мой код:

@profile.images

и я хотел бы получить только 10 изображений во время и с 10 смещениями, как это

@profile.images(:limit => 10, :offset => 10)

и не как это

has_many :images, :limit => 10, :offset => 10

Затем я хотел бы включить некоторым образом все изображения для того профиля.

@profile.count_images

Спасибо (:


has_many :images, :foreign_key => 'on_id', :conditions => 'on_type = "profile"' do
def paginate(page = 1, limit = 10, offset = nil)
  page = nil if page < 1
  limit = 1 if limit < 1
  offset = 0 if(offset && offset < 0)
  offset = 0 if (!page)
  offset = limit * (page - 1) if (page)

  all(:limit=> limit, :offset => offset)
end

конец

Теперь я хотел бы добавить это поведение к другим has_many отношениям. Но я не хотел бы копировать, вставляют код... Какая-либо идея?:P

5
задан Brad Larson 20 January 2014 в 01:46
поделиться

2 ответа

Используйте расширения ассоциации:

class Profile < ActiveRecord::Base
  has_many :images do
    def page(limit=10, offset=0)
      all(:limit=> limit, :offset=>offset)
    end
  end
end

Теперь вы можете использовать метод page следующим образом:

@profile.images.page # will return the first 10 rows
@profile.images.page(20, 20) # will return the first 20 rows from offset 20
@profile.images # returns the images as usual

Редактировать

В этом конкретном случае функция связывания может быть подходящим вариантом. Даже лямбда с named_scope может работать. Если вы определяете его в классе Profile , вы теряете повторно используемый аспект named_scope . Вы должны определить named_scope в своем классе изображения.

class Image < ActiveRecord::Base

  named_scope :paginate, lambda { |page, per_page| { :offset => ((page||1) -1) * 
                              (per_page || 10), :limit => :per_page||10 } }

end

Теперь вы можете использовать этот named_scope с ассоциацией:

@profile.images.paginate(2, 20).all

Или вы можете использовать named_scope непосредственно в классе Image

Image.paginate(2, 20).all(:conditions => ["created_at > ?" , 7.days.ago])

С другой стороны, почему вы не используете плагин will_paginate ?

8
ответ дан 14 December 2019 в 01:05
поделиться

С помощью with_scope можно ограничить вызов @profile.images и выполнить подсчет за пределами области действия.

Image.with_scope(:find => { :limit => 10, :offset => 10 }) do
  @profile.images      # load association using limit and offset
end

@profile.images.reset  # reset cached association, else size would return <=10
@profile.images.size   # go to the database again for a real COUNT(*)
1
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: