2012-11-13 3 views
6

Ich benutze Thinking Sphinx 2.0.13 mit Rails 3.2.9."Undefinierte Methode" mit Sphinx-Spektiven bei Verwendung von STI erhalten

I haben und STI-Klasse, die wie folgt aussieht:

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 

Wenn ich entweder auf dem Benutzer oder Admin-Klasse einen einzelnen Bereich zu verwenden versuchen, alles ist in Ordnung. Ich kann auch Bereiche miteinander verketten, indem Sie das Benutzermodell wie erwartet verwenden. Das Problem ist, wenn ich Bereiche auf der Admin Modellkette, die ich erhalte:

> 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> 

Es erscheint, sobald die Abfrage ausgeführt werden, da der erste Umfang auftritt. Gibt es etwas Offensichtliches, das ich vermisse, oder sieht das bei TS so aus?

+0

Benutzerklasse hat ein DB-Feld namens is_deleted? mit booleschem Typ? – Lichtamberg

+0

@Lichtamberg - ja, die Spalte ist da und ist boolesch. Entweder funktioniert der Bereich für sich selbst - nur wenn er angekettet ist, bricht er. – Codebeef

+0

könnten Sie die Antwort anzeigen, wenn Sie Admin.by_account (1) in die Konsole eingeben? – Lichtamberg

Antwort

0

Hier sind einige Probleme Menschen, bevor Sie mit sphinx_scopes hatten, dass das Problem hier sein könnte.

  • Menschen haben Probleme mit Namenskonflikten in ihrem sphinx_scopes gefunden. Ihr Bereich by_account ist ein Hauptkandidat dafür, also versuchen Sie es umzubenennen. Ich kann mir Situationen vorstellen, in denen das in einer abgeleiteten Klasse durcheinander gebracht wird, aber nicht in der Basisklasse.
  • Scope-Probleme in der Vergangenheit wurden durch Neuanordnen der Anrufe behoben, also versuchen Sie Admin.without_deleted.by_account(1). Keine Lösung, ich weiß.
  • Ich würde auch voraussagen, dass account_id ist ein Primärschlüssel (d. H. Höchstens eine User pro Account). Wenn dies der Fall ist, könnte dies erklären, warum Rails sich dafür entscheidet, es vorzeitig abzurufen.
Verwandte Themen