2012-11-13 12 views
6

Uso Thinking Sphinx 2.0.13 con Rails 3.2.9.Utilizzo di "metodo non definito" con gli ambiti Sfinge di pensiero quando si utilizza STI

Dato che ho e di classe STI che assomiglia a questo:

class User < ActiveRecord::Base 
    define_index do 
    has :account_id 
    has :is_deleted 
    end 

    sphinx_scope(:by_account) do |account_id| 
    {:with => {:account_id => account_id}} 
    end 

    sphinx_scope(:without_deleted) do 
    {:with => {:is_deleted => false}} 
    end 
end 


class Admin < User 
end 

Se tento di usare un singolo ambito sia sul utente o classe di Admin, tutto va bene. Posso anche concatenare gli ambiti usando il modello Utente, come previsto. Il problema è, se mi incateno ambiti sul modello di amministrazione, ottengo:

> Admin.by_account(1).without_deleted 

NoMethodError: Sphinx Query (2.9ms) 
    Sphinx Found 3 results 
    Admin Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin') AND `users`.`id` IN (7, 8, 9) 
undefined method `without_deleted' for #<ThinkingSphinx::Search:0x007fd3d95f7a08> 

Sembra essere in esecuzione della query, non appena si incontra il primo campo di applicazione. C'è qualcosa di ovvio che mi manca, o sembra un problema con TS?

+0

La classe utente ha un campo DB chiamato is_deleted? con tipo booleano? – Lichtamberg

+0

@Lichtamberg - sì, la colonna è lì ed è booleana. O lo scope funziona bene per proprio conto - è solo quando sono incatenati che si rompe. – Codebeef

+0

potresti mostrare la risposta se metti Admin.by_account (1) nella console? – Lichtamberg

risposta

0

Qui ci sono alcuni problemi che le persone hanno avuto con sphinx_scopes che potrebbe essere il problema qui.

  • Le persone hanno riscontrato problemi con conflitti di nomi nel loro sphinx_scopes. Il tuo obiettivo by_account è un ottimo candidato, quindi prova a rinominarlo. Posso immaginare situazioni in cui ciò viene incasinato in una classe derivata ma non nella classe base.
  • In passato, i problemi di ambito sono stati risolti riordinando le chiamate, quindi prova Admin.without_deleted.by_account(1). Non una correzione, lo so.
  • Prevedo anche che account_id sia una chiave primaria (vale a dire al massimo uno User per Account). Se è così, questo potrebbe spiegare perché Rails sta scegliendo di recuperarlo prematuramente.
Problemi correlati