/ / Wie bekomme ich einen ActiveRecord-Datensatz nach virtuellen Attributen? - Ruby-on-Rails-3, Aktiverecord, virtuelles Attribut

Wie bekomme ich ActiveRecord-Datensätze nach virtuellen Attributen? - Ruby-on-Rails-3, ActiveRecord, virtuelles Attribut

Wie kann ich in Rails 3 einen Datensatz abrufen, indem ich nach einem virtuellen Attribut schaue? Ich habe ein name Spalte und a slug das macht eine einfache Modifikation (siehe Code unten). Wie kann ich einen "Reverse Lookup" von machen slug zu name?

Ich versuche den richtigen Code für die find_by_slug Methode unten:

class Brand < ActiveRecord::Base
has_many :sale_items
validates :name, :uniqueness => true

def slug
self.name.downcase.gsub(/s/, "-")
end

def self.find_by_slug(given_slug)
first(slug: given_slug)
end
end

Wenn ich es versuche find_by_slug In der Rails Konsole habe ich eine gegeben Unknown key: slug Error.

Dies Frage scheint ähnlich, aber ich bin nicht sicher, ob es das gleiche wie mein Problem ist. Ich würde etwas Einsicht und Hilfe schätzen!

Antworten:

1 für die Antwort № 1

Da slug nicht in der Datenbank vorhanden istSie können nicht zuerst danach fragen. Was Sie tun müssen, ist die Suche nach dem Namen. Aber um dies zu tun, muss Ihre Zuordnung von "Name zu Slug" reversibel sein. Sie müssen in der Lage sein

name = "San Francisco"
slug = convert_to_slug(name)  #san-francisco
name == convert_to_name(slug) #true

Wenn Sie also einen Slug erhalten, wissen Sie, wie er heißt - dann können Sie find_by_name. Jetzt Ihre Slug-Umwandlung

downcase.gsub(/s/, "-")

ist nicht umkehrbar, es sei denn, einige implizitInformationen, die Sie nicht mit uns teilen, z. B. "Es gibt nur Leerzeichen und jeder erste Buchstabe wird groß geschrieben". Es kann also nicht "gemacht werden", und Sie sollten dieses Attribut am besten als reguläres Attribut und nicht als virtuelles Attribut definieren Ihre Konvertierung ist reversibel, dann müssen Sie nur noch verwenden

find_by_name(convert_to_name(slug))