ユーザーはプロフィールを保存する前に生年月日を入力する必要があります。また、プロファイル テーブルに age 列があります。しかし、ユーザーが生年月日と年齢を入力する必要はありません。誕生日に基づいてユーザーの年齢を計算する方法は既にあります。問題は、計算されたユーザーの年齢をデータベースに保存するにはどうすればよいですか?
5 に答える
データベースに保存せず、アプリケーションで必要なときに計算することをお勧めします。
DBに保存すると、値が更新されずに古くなるリスクがあります。
モデルに (データベースの列ではなく) 抽象属性を含めることができます。これにより、年齢が計算されます。例えば:
dob
= データベース テーブルの列
age
= 抽象属性
class User < ActiveRecord::Base
attr_accessible :dob
attr_accessor :age
def age
Time.now.year - self.dob.year
end
end
このようにして、ユーザーの年齢を簡単に見つけることができます。
u = User.find(1)
u.dob
=> Thu, 20 Mar 2008
u.age
=> 5
ただし、うるう年に関してはいくつかの問題があり、方法を調整したい場合があるため、この投稿をご覧になることをお勧めしますage
。
編集age
- とにかく、テーブルに列を追加する本当に正当な理由がある場合は、before_save
as it will be fire on create
andを使用する必要がありupdate
ます。
class User < ActiveRecord::Base
attr_accessible :dob, :age
before_save :set_age
def set_age
self.age = Time.now.year - self.dob.year
end
end
HTML ページのアプリケーションでは、java-script 関数を使用して、jquery - date メソッドでユーザーの年齢を計算できます。
calculate_age()
JSファイルに関数を書くだけです。その値を隠しフィールドの1つに入れます。その隠しフィールドを使用して、年齢を db に格納できます。
生年月日を収集している入力ボックスで、 onblur イベントを記述して calculate_age() 関数を呼び出すだけです。
HTMLコード
<input type='text' id='dob' name='dob' onblur='calculate_age(this);' />
<input type='hidden' id='age' name='age' />
JS コード
function calculate_age(element_id){
var date_of_birth = $('#'+element_id).val();
// JS code for calculating age using date of birth
$('#age').val(age);
}
class User < ActiveRecord::Base
before_create :calculate_age
def calculate_age
self.age= Time.now - self.birthday # do calculate yourself, I don't know your parameters
end
あなたはそれを保存する必要があります。年齢は、実行時にDOB列から計算する必要があります。