2016-05-27 8 views
1

I持っている二つのモデル:外部キーとして「日付」列から抽出年を使用したRails関連付けですか?

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

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

人でBirthYearでyeardate間の関連付けを作成する方法はありますか?私の目標は、特定の年に何人が生まれたかを把握し、その番号がいつ変化するかを追跡することです。

私は基本的にSQL条件ものと、主キーとしてdateを使用したい:

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

編集:私は別のを使用して考えていた理由である、私は可能であればcounter_cacheを使用したいと思いますモデル。カウント値を使用するたびに、extractでレコードを数えないようにしたいと考えています。

答えて

1

あなたが説明したようにBirthYearは別個のモデルを保証します。

これはいかがですか?

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

です。唯一の問題(と私はこれを言及して申し訳ありません)は、毎回SQL経由でカウントを行うことを避けるためにcounter_cacheを使用したいと思います。あなたはこれを行う方法のアイデアはありますか? – etdev

+0

あなたは[conditional counter_cache](http://douglasfshearer.com/2006/10/06/custom-counter-cache-with-conditions.html)を使うことができますが、ここの2つのモデルは間違った方法(種類醜いの)。クエリで 'extract'を使いたくない場合は、誕生日を' day'、 'month'と' year'に分割していますので、条件を簡潔にすることができます –

0

あなたが与えられた年に生まれ、人々の変更を追跡する必要がある場合は、Personモデルのbefore_createコールバックを実装しよう(多分あなたはユーザーの削除を追跡するafter_destroyコールバックを追加する必要があります):

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

    # ... 
    private 

    def do_some_stuff 
    # ... 
    end 
end 

インデックス作成のためだけにBirthYearモデルが存在するようです。

+0

データベース(私はカウンタキャッシュと考えていました)が、 'Person'データベースに新しい列を追加し、作成/削除時にそれを更新するだけでいいと思いますか? – etdev

+0

ユーザカウントにアクセスする必要がない場合(選択した年)、2つのフィールドだけで新しいモデルを追加しないほうが簡単です。 –

関連する問題