簡體   English   中英

紅寶石活動記錄條件的計算字段

[英]ruby active record conditions for the calculated field

我正在嘗試執行計算,為計算值應用條件並在一個查詢中對結果進行計數。 問題是我不知道如何從條件中引用計算字段。

我有Issues.created_on字段,我想查找有關用戶提供的幾周內每周創建多少個問題的統計信息。 這是我的查詢在MySql中的樣子:

mysql>  SELECT status_id as group_id,
YEAR(created_on)*1000+WEEK(created_on,1) as range_value, count(*) as
noOfEntries FROM `issues` WHERE (`issues`.`project_id` IN (1))  GROUP
BY issues.status_id, range_value;

+----------+-------------+-------------+
| group_id | range_value | noOfEntries |
+----------+-------------+-------------+
|        1 |     2012031 |           2 |
|        5 |     2012015 |           1 |
+----------+-------------+-------------+

這是我的代碼(簡體):

# Range value is dynamic: "YYYYXXX", where YYYY is year and XXX could be week, month or day of year
range_value = "YEAR(created_on)*1000+WEEK(created_on,1)"    
select = "#{range_value} as range_value, count(*) as noOfEntries"
grouping = "range_value"
# other conditions are provided by user, so we just add one here
conditions["range_value"] = range[:min]..range[:max]

rows = Issue.all(:select => select, :conditions => conditions, :readonly => true, :group => grouping)

但是我得到這個錯誤:

ActiveRecord::StatementInvalid (Mysql::Error: Unknown column 'issues.range_value' in 'where clause': SELECT YEAR(created_on)*1000+WEEK(created_on,1) as range_value, 'weeks' as range_type, count(*) as logged_hours, 1 as entries, 'priority_id' as grouping, issues.priority_id as group_id FROM `issues` WHERE (`issues`.`range_value` BETWEEN '2012012' AND '2012031' AND `issues`.`project_id` IN (1))  GROUP BY range_value, issues.priority_id ORDER BY 1 asc, 6 asc):

我嘗試修改的代碼不是我的,因此無法向Issues對象添加任何新字段或方法。 所以像解決不會為我工作,我猜。

你應該做這個:

rows = Issue.select(select).where(conditions).group(grouping).readonly

更清楚了

我發現了一個實際上有幫助的代碼示例

ActiveRecord在您的數據庫查詢中沒有包含HAVING子句的參數,有時我發現自己需要它。 幸運的是,您可以將其潛入:group參數的末尾,而無需訴諸find_by_sql()調用。 (我不記得曾經在沒有GROUP BY的情況下使用過HAVING,盡管在某些情況下這樣做很有意義。)

例如,這是來自我的一個Rails應用程序的查詢,該查詢在數據庫中找到所有重復的電子郵件地址:

duplicates = User.find( :all,
  :select     => "email, COUNT(email) AS duplicate_count",
  :conditions => "email IS NOT NULL AND email != ''",
  :group      => "email HAVING duplicate_count > 1"
)

因此,稍加修改后,我的代碼就可以工作了:

# Range value is dynamic: "YYYYXXX", where YYYY is year and XXX could be
# week, month or day of year
range_value = "YEAR(created_on)*1000+WEEK(created_on,1)"    
select = "#{range_value} as range_value, count(*) as noOfEntries"
# CHANGED THIS LINE from: grouping = "range_value"
grouping = " HAVING range_value BETWEEN #{range[:min]} AND #{range[:max]}"

# other conditions are provided by user, so we just add one here
# REMOVED THIS LINE
# conditions["range_value"] = range[:min]..range[:max]

rows = Issue.all(:select => select, :conditions => conditions, :readonly => true, :group => grouping)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM