2016-05-27 7 views
1

Ich habe zwei Modelle:Schienenverknüpfung mit extrahiertem Jahr aus Spalte "Datum" als Fremdschlüssel?

class Person < ActiveRecord::Base 
    # birthday: date 
end 

class BirthYear < ActiveRecord::Base 
    # year: int 
    # people_count: int 
end 

Gibt es eine Möglichkeit zur Gründung einer Assoziation zwischen year in Geburtsjahr und date in Person zu schaffen? Mein Ziel ist es, zu verfolgen, wie viele people in einem bestimmten Jahr geboren wurden, und zu verfolgen, wenn sich diese Zahl ändert.

Ich mag im Grunde date als Primärschlüssel mit der SQL-Bedingung verwenden, dass:

extract(year from people.birthday) = birth_year.year 

EDIT: Anmerkung Ich mag einen counter_cache wenn möglich verwenden, weshalb ich dachte über einen separaten Modell. Ich möchte vermeiden, die Aufzeichnungen mit extract jedes Mal zu zählen, wenn ich den Zählwert verwende.

Antwort

1

Nicht sicher BirthYear wie Sie es beschrieben, garantiert ein separates Modell.

Wie wäre es damit?

class Person < ActiveRecord::Base 
    # birthday: date 

    def self.born_in_year_count(year) 
    self.where('extract(year from birthday) = ?', year).count 
    end 

    def birth_year 
    birthday.year 
    end 
end 

Person.born_in_year_count(1990) 
+0

Ich sehe. Das einzige Problem (und es tut mir leid, das nicht zu erwähnen) ist, dass ich gerne einen counter_cache verwenden würde, um zu vermeiden, dass jedes Mal per SQL gezählt werden muss. Hast du eine Idee, wie das geht? – etdev

+0

Sie könnten * konditionellen counter_cache verwenden (http://douglasfshearer.com/2006/10/06/custom-counter-cache-with-conditions.html), aber zwei Modelle hier reiben mich nur in die falsche Richtung (Art von hässlich). Wenn du 'extract' nicht in deiner Anfrage verwenden willst, teile den Geburtstag in' Tag', 'Monat' und' Jahr' auf, so dass du eine vereinfachte Version haben kannst, in der die Bedingung –

0

Wenn Sie Änderung der Menschen in bestimmten Jahr geboren verfolgen müssen, versuchen before_create Rückruf für Person Modell zu implementieren (vielleicht müssen Sie after_destroy Rückruf hinzufügen Benutzer Entfernung zu verfolgen):

class Person < ActiveRecord::Base 
    # birthday: date 
    before_create :do_some_stuff 

    # ... 
    private 

    def do_some_stuff 
    # ... 
    end 
end 

Scheint wie BirthYear Modell existieren nur für die Indizierung.

+0

ich möchte, dass die Anzahl verfügbar ist die Datenbank (ich dachte, es wäre ein Counter-Cache), aber meinst du, ich sollte einfach eine neue Spalte für die Person-Datenbank hinzufügen und sie beim Erstellen/Löschen aktualisieren? – etdev

+0

In dem Fall, wenn Sie häufig nicht auf die Benutzeranzahl (für das ausgewählte Jahr) zugreifen müssen, ist es einfacher, ein neues Modell nicht mit nur zwei Feldern hinzuzufügen. –

Verwandte Themen