0

Rails に変換する PHP 駆動の Web サイトがあります。現在、MySQL ルーチンに次のロジックがあります。

DECLARE FirstWeighinDate DATE;
DECLARE FirstWeighinWeight DECIMAL(5,1);
DECLARE MostRecentWeighinDate DATE;
DECLARE MostRecentWeighinWeight DECIMAL(5,1);
DECLARE NumberOfWeighins INT(11);
DECLARE NumberOfDeficitRecords INT(11);
DECLARE AverageDeficit INT(11);
DECLARE UserHeight INT(11);
DECLARE MostRecentBMI DECIMAL(5,1);

SELECT date INTO FirstWeighinDate FROM tblDeficitEntries WHERE weight IS NOT NULL AND user_id = inUserId ORDER BY date ASC LIMIT 1;
SELECT weight INTO FirstWeighinWeight FROM tblDeficitEntries WHERE weight IS NOT NULL AND user_id = inUserId ORDER BY date ASC LIMIT 1;
SELECT date INTO MostRecentWeighinDate FROM tblDeficitEntries WHERE weight IS NOT NULL AND user_id = inUserId ORDER BY date DESC LIMIT 1;
SELECT weight INTO MostRecentWeighinWeight FROM tblDeficitEntries WHERE weight IS NOT NULL AND user_id = inUserId ORDER BY date DESC LIMIT 1;
SELECT Height INTO UserHeight FROM tblLogins WHERE id = inUserId LIMIT 1;
SELECT COUNT(id) INTO NumberOfWeighins FROM tblDeficitEntries WHERE weight IS NOT NULL AND user_id = inUserId;
SELECT COUNT(id) INTO NumberOfDeficitRecords FROM tblDeficitEntries WHERE user_id = inUserId;
SELECT (SUM(deficit) / NumberOfDeficitRecords) INTO AverageDeficit FROM tblDeficitEntries WHERE user_id = inUserId;
SELECT ((MostRecentWeighinWeight * 703) / (UserHeight * UserHeight)) INTO MostRecentBMI;

SELECT FirstWeighinDate, FirstWeighinWeight, MostRecentWeighinDate, MostRecentWeighinWeight, NumberOfWeighins, NumberOfDeficitRecords, AverageDeficit, MostRecentBMI;

私はMVCの状況を信じており、そのロジックはモデルに属しています。これを達成する方法がわかりません。ハッシュである仮想アクセサーを使用して行う必要があると考えていました。あれは正しいですか?モデル以外の場所にこれを配置する必要がある場合、どこに移動する必要がありますか? 回答でコード全体が変換されるとは思いませんが、アイデアを得ることができるように、いくつかの行を変換していただければ幸いです。ありがとう!

4

1 に答える 1

1

したがって、2 つのモデルがあります。User があり、User には多くの関連する Entry オブジェクトがあります。

class User < ActiveRecord::Base
  has_many :entries
end

class Entry < ActiveRecord::Base
  belongs_to :user
  #attributes include weight, date
end

では、これらの値はどうでしょうか。

あなたが望むことを行うための最も基本的な方法は、関連付けられたモデルを使用して、これらすべてを User モデルのメソッドに変換することです。

例えば、

SELECT date INTO FirstWeighinDate FROM tblDeficitEntries WHERE weight IS NOT NULL AND user_id = inUserId ORDER BY date ASC LIMIT 1;

User クラスでは、次のように置き換えることができます。

def first_weighin_date
  entries.order('date asc').first.date
end

次に、 User オブジェクトがある場所ならどこでも、メソッドを簡単に呼び出すことができます。

u = User.find_by_name('Bob')
u.first_weighin_date

この情報を一度に多数のユーザーに表示する場合は、熱心な読み込みを利用することをお勧めします。たとえば、これは非常に非効率的です。

User.all.map(&:first_weigh_in_date)

データベースを個別に呼び出して、各ユーザー オブジェクトに関連付けられたエントリをロードします。100 ユーザー?101 件のデータベース ヒット。Rails に先に進み、すべてのオブジェクトをロードするように指示します。それらが必要になるからです。

User.includes(:entries).map(&:first_weigh_in_date)

これで、データベースへの呼び出しが 2 つだけになりました。

于 2012-10-18T17:05:48.333 に答える