Rails: выберите все дочерние модели Parent и отсортируйте по дате, созданной в Active Record - PullRequest
0 голосов
/ 06 апреля 2020

В моем приложении rails я пытаюсь выбрать все дочерние модели («pdfs», «видео», «инфографика»), которые имеют ссылку на родительскую модель («категория»). Эти три дочерние модели могут принадлежать только одной из трех родительских моделей (это выполняется с использованием проверки Exclusive ar c в дочерних моделях). Таким образом, у них есть один шанс из трех принадлежать моей родительской модели («категория»).

Есть ли способ выбрать все дочерние модели («pdfs», «видео», «инфографика»), которые привязан к моей указанной c родительской модели («категория»)? Если я смогу это сделать, можно ли отсортировать каждый из этих экземпляров дочерних моделей по дате их создания? И, наконец, смогу ли я иметь этот упорядоченный список дочерних экземпляров в виде массива, чтобы я мог перебирать его в представлении?

Спасибо за вашу помощь! Модель настроена ниже.

Родительская модель:

class Category < ApplicationRecord
  belongs_to :navbar_base_folder
  has_many :sub_categories, dependent: :destroy
  has_many :infographics, dependent: :destroy
  has_many :videos, dependent: :destroy
  has_many :pdfs, dependent: :destroy
end

Трое детей:

class Pdf < ApplicationRecord
  belongs_to :sub_category, optional: true
  belongs_to :category, optional: true
  belongs_to :secret_category, optional: true
  belongs_to :secret_sub_category, optional: true
end

class Video < ApplicationRecord
  belongs_to :sub_category, optional: true
  belongs_to :category, optional: true
  belongs_to :secret_category, optional: true
  belongs_to :secret_sub_category, optional: true
end

class Infographic < ApplicationRecord
  belongs_to :sub_category, optional: true
  belongs_to :category, optional: true
  belongs_to :secret_category, optional: true
  belongs_to :secret_sub_category, optional: true
end

1 Ответ

0 голосов
/ 07 апреля 2020

Это идеальный кандидат для наследования одной таблицы (STI).

class Category < ApplicationRecord
  has_many :contents, dependent: :destroy
  has_many :infographics
  has_many :pdfs
  has_many :videos
end

# db/migrate/create_content.rb
# Create a migration for Content
  create_table :content do |t|
    # .... add your attributes here ...
    t.string :type, index: true
  end
end

# app/models/content.rb
class Content < ApplicationRecord
  belongs_to :category
  # `has_many ... optional: true` is not invalid, but you should aim to
  # keep your associations & validations separate. Instead put this as a
  # validation:
  validates :category, presence: true
end

# app/models/pdf.rb
class Pdf < Content; end

# app/models/infographic.rb
class Infographic; end

# app/models/video.rb
class Video < Content; end

Затем найдите все содержимое:

@category = Category.first
@contents = @category.contents.order(date: :desc)

Надеюсь, что поможет:)

PS: Ваш Category должен быть реорганизован в соответствии с шаблоном родитель / потомок, если это возможно:

...