Pensando Sphinx - RuntimeError: Atributo que falta por clave externa
-
18-09-2019 - |
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?
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