Думающий Сфинкс — RuntimeError:Отсутствует атрибут внешнего ключа
-
18-09-2019 - |
Вопрос
Впервые пытаюсь поладить со Сфинксом/Думающим Сфинксом.
Мои модели определены следующим образом (упрощенно):
class Branch < ActiveRecord::Base
has_many :salesmen, :class_name => "User"
has_many :leads, :through => :salesmen
end
class User < ActiveRecord::Base
belongs_to :branch
has_many :leads, :foreign_key => "owner_id"
end
class Lead < ActiveRecord::Base
belongs_to :owner, :class_name => "User"
define_index do
indexes company_name
indexes :name, :sortable => true
has owner.branch_id, :as => :branch_id
indexes [owner.last_name, owner.first_name], :as => :owner_full_name, :sortable => true
end
end
Каждый раз, когда я звоню
Branch.first.leads.search
я получил
RuntimeError: Missing Attribute for Foreign Key branch_id
Что я делаю не так?
Решение
Проблема в том, что Думающему Сфинксу нужен branch_id
в качестве атрибута в вашем индексе, чтобы он мог ограничить результаты только соответствующей ветвью (поскольку вы ищете внутри ассоциации).
Из Ваших ассоциаций (а может просто моей острой потребности во сне) непонятно, принадлежит лид ветке через владельца или напрямую.Если первое, то предложение Бена, вероятно, верное.В противном случае попробуйте добавить следующее в свой define_index
блокировать:
has branch_id, :as => :direct_branch_id
Альтернативный подход, после прочтения комментариев, — добавить свой метод поиска в ассоциацию лидов в Branch.Смутная попытка (я уверен, вам понадобится отладка):
has_many :leads, :through => :salesmen do
def search(*args)
options = args.extract_options!
options[:with] ||= {}
options[:with][:branch_id] = proxy_owner.id
args << options
Lead.search(*args)
end
end
Это должно обойти тот факт, что у вас нет прямой ссылки на ветку из Лида.Единственная возможная проблема заключается в том, что я не уверен, загружаются ли пользовательские расширения до или после того, что внедряет Thinking Sphinx.Попробуйте, посмотрите, поможет ли это.
Другие советы
Если вы скажете Лид belongs_to
Филиал, то у вас должен быть branch_id
в таблице лидов.Поскольку вы этого не делаете, это не belongs_to
отношение.Я думаю, вам нужно что-то вроде этого:
class Branch < ActiveRecord::Base
has_many :leads, :through => :salesmen
has_many :salesmen, :class_name => "User"
end
class User < ActiveRecord::Base
belongs_to :branch # users table has branch_id
has_many :leads, :foreign_key => "owner_id"
end
class Lead < ActiveRecord::Base
belongs_to :owner, :class_name => "User" # leads table has owner_id
define_index do
indexes :company_name
indexes :name, :sortable => true
has owner.branch_id, :as => :branch_id
indexes [owner.last_name, owner.first_name], :as => :owner_full_name, :sortable => true
end
end
Я считаю, что вам не хватает опции :through в вашей ветке.Попробуйте обновиться до:
class Lead < ActiveRecord::Base
has_one :branch, :through => :owner