Думающий Сфинкс — RuntimeError:Отсутствует атрибут внешнего ключа

StackOverflow https://stackoverflow.com/questions/799085

Вопрос

Впервые пытаюсь поладить со Сфинксом/Думающим Сфинксом.

Мои модели определены следующим образом (упрощенно):

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top