Форма администратора Rails для ассоциации has_many - PullRequest
0 голосов
/ 09 января 2019

Например, скажем, у меня есть ассоциация в одной из моих моделей:

has_many :students

Мы знаем, rails_admin создает поле ввода с множественным выбором в форме, где пользователь может выбирать студентов.

Множественный выбор перечисляет всех студентов.

У меня вопрос: есть ли способ отфильтровать этих учеников и перечислить только тех учеников, которые удовлетворяют некоторым условиям? Если есть, как мне поступить? Например, я хочу перечислить только тех студентов, которые, скажем, активны.

Есть 100 студентов, и 75 из них являются активными. Я хочу, чтобы в списке были только те 75.

На скриншоте ниже я хочу, чтобы только демонстрационные проекты отображались слева.

enter image description here

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы хотите добавить поле is_active (Boolean) в свою таблицу, чтобы поддерживать статус студента активным или нет. затем используйте область, чтобы отфильтровать студентов.

Модель

class Student< ApplicationRecord
    scope :active_students, -> { where(is_active: true) }
    scope :deactive_students, -> { where(is_active: false) }
end

Вызов этой области

@active_students = Student.active_students
@deactive_students = Student.deactive_students

это полезно!

0 голосов
/ 09 января 2019

Да, вы можете охватить ассоциацию следующим образом

  rails_admin do
    edit do
      field :students do
        associated_collection_scope do
          class_room = bindings[:object]

          proc { |scope| scope.where(class_room: class_room) }
        end
      end
    end
  end
0 голосов
/ 09 января 2019

Да, вы можете использовать области действия в родительской модели.

Прочитайте это для Области применения Прочитайте это для rails_admin Области применения

class Teacher < ApplicationRecord
  has_many :students
  scope :active_students, -> { where(active: true) }
end

Тогда вы можете использовать его как:

Teacher.first.active_students

UPDATE:

Вы должны специально настроить это поле students, используя настраиваемое поле, как указано здесь

...