Запрос has_one, который является подмножеством has_many - PullRequest
0 голосов
/ 15 мая 2019

У меня есть некоторые полиморфные правила, в которых я отслеживаю изменения, и я хотел бы запросить самое последнее (текущее) правило.Я понимаю, что могу использовать own_to для отслеживания этого, но я бы хотел оставить has_one.Вот немного модуля

has_many :rule_transitions, class_name: "#{name}AppliedRuleTransition", dependent: :destroy

has_one :current_rule_transition, -> { order created_at: :desc }, class_name: "#{name}AppliedRuleTransition", inverse_of: model_name.param_key.to_sym
has_one :current_rule, through: :current_rule_transition, source: :rule

Я бы хотел запросить current_rule, но rule_transitions запрашивается полностью.

Моя текущая попытка с postgres 'FIRST_VALUE

scope :rule, lambda { |q|
  joins(:current_rule)
  .select("#{model_name.plural}.*, rules.id = FIRST_VALUE(#{model_name.param_key}_applied_rule_transitions.rule_id) OVER(PARTITION BY #{model_name.param_key}_applied_rule_transitions.id ORDER BY #{model_name.param_key}_applied_rule_transitions.created_at DESC)")
  .where(rules: { slug: q })
}

Хотя я недостаточно хорошо понимаю эту функцию, и это все равно не дает мне того, чего я хочу.

1 Ответ

1 голос
/ 16 мая 2019

Просто используйте belongs_to и положите внешний ключ на стол.Это позволит вам правильно загружать ассоциацию, чтобы избежать проблем с n + 1, особенно в частом случае, когда вам нужен список записей и последний связанный элемент без загрузки всей ассоциации.

Он также будет работать намного лучшечем альтернативы.

belongs_to :current_rule_transition, class_name: "#{name}AppliedRuleTransition"
has_many :rule_transitions, 
  class_name: "#{name}AppliedRuleTransition", 
  dependent: :destroy,
  after_add: ->(model, transition) { model.update(current_rule_transition: transition) }

Не нужно усложнять себе жизнь.

...