2013-05-02 2 views
7

In meiner Rails-App müssen Benutzer nur ihre E-Mail-Adresse eingeben und bei der Anmeldung einen Namen angeben. Geben Sie ihnen dann jedoch die Möglichkeit, umfassendere Kontaktinformationen für ihr Profil anzugeben. Daher habe ich eine User.rb Modell, das eine Verbindung mit Contact.rb hat, nämlichSo fügen Sie einer verknüpften Tabelle eine Verknüpfung mit has_one hinzu

User.rb

has_one :contact 

Contact.rb

belongs_to :user 

Contact.rb hat den vorhersagbaren Felder, die Sie erwarten können, wie Adresse, Postleitzahl usw., aber es speichert auch die provinc_id für eine Beziehung mit dem Province.rb-Modell, so

Contact.rb

attr_accessible :address, :city, :mobile, :postalcode, :province_id, :user_id 
belongs_to :user 
belongs_to :province 

Province.rb

has_many :contacts 

Ich tat es auf diese Weise (und nicht den Namen der Provinz als „string“ auf contact.rb Lagerung), so dass ich noch einfacher könnte (so dachte ich,) kategorisieren Benutzer nach Provinz.

In der Show Aktion eines der artists_controller, ich das Verfahren folgendes zu überprüfen, ob der Benutzer von Provinz zu sortieren versucht und dann eine artists_by_province Methode aufrufen, die führt eine Suche

if params[:province_id] 
    province = params[:province_id] 
    province = province.to_i #convert string to integer 

    @artistsbyprovince = User.artists_by_province(province) 

    else 

    @artists = User.where(:sculptor => true) 

    end 

Dies ist auf dem User.rb Modell, das es nennt, wenn eine Provinz-ID in

scope :artists_by_province, lambda {|province| 
    joins(:contact). 
    where(contact: {province_id: province}, 
     users: {sculptor: true}) 

    } 

geben wird jedoch es mir diesen Fehler gibt:

Could not find table 'contact' 

Wenn ich Kontakte zu knüpfen Plural

scope :artists_by_province, lambda {|province| 
    joins(:contacts). 
    where(contacts: {province_id: province}, 
     users: {sculptor: true}) 

    } 

Dieser Fehler

Association named 'contacts' was not found; perhaps you misspelled it? 

jemand kann mir sagen, was ich falsch mache, wenn ich diese Abfrage mache?

Update: Ich änderte einige der Details nach der Einlieferung, weil mein Kopieren und Einfügen mit ihm einige Probleme hatten

P. S. ignoriere die Tatsache, dass ich nach einem "Bildhauer" suche. Ich habe die Namen der Benutzertypen für die Frage geändert.

von schema.rb

create_table "contacts", :force => true do |t| 
    t.string "firm" 
    t.string "address" 
    t.string "city" 
    t.string "postalcode" 
    t.string "mobile" 
    t.string "office" 
    t.integer "user_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.integer "province_id" 
    end 

Antwort

0

Kann versuchen Sie die folgenden?

scope :artists_by_province, lambda {|province| 
    joins(contact: {province: { id: province}}). 
    where(sculptor: true) 
} 
+0

, die mir diesen Fehler gab: Verein namens 'province_id' wurde nicht gefunden; vielleicht hast du es falsch geschrieben? – Leahcim

+0

Bitte, sehen Sie sich meine aktualisierte Post –

+0

Ich bin nicht sehr erfahren mit diesem. Ist deine Lösung besser als meine? Wenn ja, kannst du erklären warum? Vielen Dank. – Leahcim

7

Das Problem wurde durch Verwendung von contact (Singular) in der Join feste und contacts (Plural) in der WHERE-Klausel. Ich vermute, dass "Kontakt" (Singular) die has_one-Verknüpfung zwischen User.rb und Contact.rb widerspiegelt, während "contacts" in der where-Klausel verwendet wird, um den Namen der Tabelle zu repräsentieren, die immer plural ist.

User.rb

has_one :contact 

    scope :artists_by_province, lambda {|province| 
    joins(:contact). 
    where(contacts: {province_id: province}, 
     users: {sculptor: true}) 

    } 
+0

Ja, das verstehe ich auch. Übrigens ist meine Post für Sie nicht von Nutzen, da sie die province_id-Bedingung für die linke Join-Klausel erzeugt, die für alle Benutzer mit sculptor = true gilt. –

Verwandte Themen