Rails как найти объект через его полиморфичную связь?

База данных - mongodb, используем mongoid

Ситуация следующая: Класс страна (Country)
Имеет множество названий через полиморфичную связь:
(Причина в том, чтобы можно было по любому названию найти что это такое - страна-ли?, город-ли? или человек?)
has_many :alternames, :as => :alternameable, :class_name => 'Altername'

class Altername
include Mongoid::Document
field :name, type: String
field :lang, type: String

belongs_to :alternameable, :polymorphic => true
end

Не могу найти решение - как по "названию" - name получить Country (если в принципе существует Country с таким name)
Country.alternames.find_by(name: 'Вася') не прокатывает - говорит что неизвестных параметр alternames для Country:class
  • Вопрос задан
  • 2400 просмотров
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
Вообще слабо понял задачу, точнее, то, как вы ее решаете, но это
Country.alternames.find_by(name: 'Вася')

Ясное дело не прокатит, потому что has_many да и все другие возможные связи имеет экземпляр класса, а не класс.

То есть, работать у Вас должно что-то вроде
Country.first.alternames

Скорее всего, Вам здесь нужно что-то вроде:
Country.where(alternames: { name: "Вася" })
Или вариации (например, добавить join, убрать класс нэйм и т.д., уже по контексту)

UPD:
Я бы в Вашем случае сделал concern

# app/models/concerns/alternameable.rb
module Alternameable

  extend ActiveSupport::Concern

  def self.included(base)

    base.class_eval do

      def has_altername_for?(name)
        joins(:alternames).where(name: name, alternameable_type: self.name).present?
      end

    end
  end

  module ClassMethods
  end

end


И подключал к каждому классу
class Country
include Alternameable
end
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы