#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. Ах да, так вот что это сделало. Спасибо!