Pregunta

Tratando de conseguir junto con Sphinx / Pensando Sphinx por primera vez.

Tengo mis modelos definidos como sigue (simplificado):

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

Cada vez que llamo

Branch.first.leads.search

consigo

RuntimeError: Missing Attribute for Foreign Key branch_id

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

El problema es que el pensamiento Sphinx necesita branch_id como un atributo en su índice, por lo que puede restringir los resultados sólo a la rama correspondiente (porque usted está buscando dentro de una asociación).

No está claro a partir de sus asociaciones (o tal vez de que sólo mi extrema necesidad de dormir) si una ventaja pertenece a una rama a través del propietario, o directamente también. En el primer caso, la sugerencia de Ben es probablemente correcta. De lo contrario, trate de añadir lo siguiente a su bloque define_index:

has branch_id, :as => :direct_branch_id

Un enfoque alternativo, después de leer los comentarios, es añadir su método de búsqueda a la asociación conduce en rama. Un vago intento (que tendrá que depurar, estoy seguro):

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

Esto debe moverse por el hecho de que usted no tiene una referencia directa a la rama de plomo. El único problema posible es que no estoy seguro de si las extensiones personalizadas se cargan antes o después de lo Pensando inyecta Sphinx. Darle un tiro, ver si ayuda.

Otros consejos

Si usted dice una belongs_to llevar una rama, entonces usted debe tener un branch_id en la tabla de clientes potenciales. Dado que usted no lo hace, no es una relación belongs_to. Creo que se necesita algo como esto:

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

Creo que se está perdiendo una: a través de la opción en su relación rama. Intente actualizar a:

class Lead < ActiveRecord::Base
  has_one :branch, :through => :owner
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top