Rails 3 ActiveRecord запрос - PullRequest
3 голосов
/ 24 мая 2011

Имеется приложение Rails 3 со следующими моделями:

# == Schema Information
# Schema version: 20110517144920
#
# Table name: orders
#
#  id         :integer         not null, primary key
#  user_id    :integer         not null
#  name       :string(255)     not null
#  state      :string(255)
#  created_at :datetime
#  updated_at :datetime
#

class Order < ActiveRecord::Base

  belongs_to                          :user
  has_many                            :multipage_pdfs,  :as => :assetable,   :dependent => :destroy
  has_many                            :singlepage_pdfs, :as => :assetable,   :dependent => :destroy
  ...
end


# == Schema Information
# Schema version: 20110511064747
#
# Table name: assets
#
#  id             :integer         not null, primary key
#  assetable_id   :integer         not null
#  assetable_type :string(255)     not null
#  state          :string(255)
#  type           :string(255)     not null
#  name           :string(255)     not null
#  document       :string(255)     not null
#  version        :integer         default(0), not null
#  created_at     :datetime
#  updated_at     :datetime
#

class Asset < ActiveRecord::Base
  ...
end


class SinglepagePdf < Asset
  ...
end

версия актива # увеличивается при каждом создании нового актива, если актив с идентичным именем существует, поэтому мои активы обычно выглядят (упрощенно):

    | id | assetable_id | assetable_type  |   name  | version | type           |
    |  1 |             1 |           Order | my.pdf  |        1 | SinglepagePdf |
    |  2 |             1 |           Order | my.pdf  |        2 | SinglepagePdf |
    |  3 |             1 |           Order | my.pdf  |        3 | SinglepagePdf |
    |  4 |             1 |           Order | bla.pdf |        1 | SinglepagePdf |

Теперь мне нужно получить все singlepage_pdfs одного заказа, но только последнюю версию для каждого имени. Как мне этого добиться?

o = Order.find(1)
singlepage_pdfs = o.singlepage_pdfs.find(...)

Результат должен содержать только активы с идентификаторами 3 и 4 ...

Ответы [ 2 ]

0 голосов
/ 04 июня 2011

Во-первых , я не уверен, что ваши ассоциации установлены правильно. Вам может понадобиться ввести другой слой, чтобы у вас было что-то вроде:

Order has_many Asset belongs_to Assetable(polymorphic)

Затем вы можете определить ассоциации областей для каждого типа сборки в модели Order (через has_many :through).

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

0 голосов
/ 24 мая 2011

Попробуйте это, он группирует все singlepage_pdfs по имени и возвращает последнюю версию каждого

o.singlepage_pdfs.group("name").order("version DESC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...