Создать ассоциацию belongs_to с другой моделью из концерна

#ruby-on-rails #polymorphic-associations

#ruby-on-rails #полиморфные ассоциации

Вопрос:

У меня есть полиморфная модель и одна из нескольких обычных моделей.

 class Task
  belongs_to :taskable, polymorphic: true
end

class Building
  include Taskable
end
  

И у меня есть следующая проблема / смешивание.

 module Taskable
  extends ActiveSupport::Concern

  included do
    has_many :tasks, as: :taskable
  end

  class_methods do
    def tasks
      Task.where(taskable: all)
    end
  end
end
  

В нашем приложении мы должны иметь возможность объединять задачи для определенных моделей, таких как building. Мы смогли добиться этого, добавив следующий параметр belongs_to в модель задачи.

 belongs_to :building, -> { where(tasks: { taskable_type: Building.name }) }, foreign_key: taskable_id, foreign_type: Building.name
  

Однако нам нужно добавлять это belongs_to вручную каждый раз, когда мы хотим сделать другую модель доступной для выполнения. Мы хотим, чтобы проблема автоматически создавала ассоциацию belongs_to для задачи. Мы использовали метапрограммирование для создания ассоциации для расширяемого класса, но ассоциация была создана только при загрузке класса. Я хочу, чтобы при запуске консоли был создан belongs_to, то же самое с сервером.

 # In Taskable concern.
# Is only called when we load a performable in the console.
Task.belongs_to class.name.to_sym, -> { where(tasks: { taskable_type: class.name }) }, foreign_key: taskable_id, foreign_type: class.name
  

Есть ли способ заставить это работать?

Комментарии:

1. По умолчанию для среды разработки используется отложенная загрузка, вы можете изменить ее на ускоренную загрузку, установив config.eager_load = true в development.rb. Затем классы будут загружены по мере их производства и контроля качества.

2. Проблема в том, что это замедлит запуск.

3. Ах да, так вот что это сделало. Спасибо!