0

ロケーション>ホットスポット>アカウントの3つのモデルがあります

私の場所モデルでは、これがあります:

has_many :hotspots
has_many :accounts, :foreign_key => :calledstationidclean, :through => :hotspots

各場所のアカウント モデルから要約データを表示しようとしています。

以下は正常に動作します:

  scope :location_history, lambda { |id|
                               joins('INNER JOIN hotspots b ON locations.id = b.location_id INNER JOIN account ON b.mac = account.calledstationidclean')
                               .where(:id => id)
                               .select("count(locations.id) AS sessions_count, sum(account.acctoutputoctets) AS downloads, sum(account.acctinputoctets) AS uploads, count(distinct account.callingstationid) AS unique_user")
                            }

しかし、いくつかの計算を実行する必要があり、これを行う方法がわかりません。

通常、アカウント モデルでは、次のようなことができます。

 def self.session_time
   Account.sum("acctsessiontime")
 end

 def self.average_session
   self.session_time / Account.count
 end

同様のことを自分の位置モデルで行うにはどうすればよいですか?また、表示している特定の位置の情報のみを表示するにはどうすればよいですか? 実際に結合を実行する必要がありますか?

4

1 に答える 1

1

はい、参加する必要があります。

  scope :location_history,
        lambda { |id| joins(:hotspots, :accounts).where(:id => id).
                      select("sum(account.acctsessiontime) as acctsessiontime, count(locations.id) AS sessions_count, sum(account.acctoutputoctets) AS downloads, sum(account.acctinputoctets) AS uploads, count(distinct account.callingstationid) AS unique_user")
               }

ちなみに、グループを使用して、これらすべてを場所からのレコードと組み合わせることができます。

  scope :with_history,
        lambda { |id| joins(:hotspots, :accounts).where(:id => id).
                      select("locations.*, sum(account.acctsessiontime) as acctsessiontime, count(locations.id) AS sessions_count, sum(account.acctoutputoctets) AS downloads, sum(account.acctinputoctets) AS uploads, count(distinct account.callingstationid) AS unique_user")
               }

これにより、すべての Location フィールドと実行中の集計を含む Location オブジェクトが返されます。

于 2012-04-23T10:35:33.967 に答える