2013-02-15 129 views
2

我正在使用查找我的sql,並且我想計算數據庫中的某些內容並添加到我的模型中。Find_by_sql和計算字段

我西港島線儘量簡化代碼

class User < ActiveRecord::Base 
    attr_accessor :comments_count 

end 

而且別的地方:

@users = User.find_by_sql("select * (select count(*) from comments where user_id=u.id) as comments_count from Users u") 


@user.map{|u| puts u.comments_count} 

任何幫助嗎?

回答

0

好吧,我明白了。 它與attr_accessor無關。我不得不刪除它。

@users = User.find_by_sql("select * (select count(*) from comments where user_id=u.id) as comments_count from Users u") 

@user.map do |u| 
    puts u.comments_count if @user.has_attribute?(:comments_count) 
end 
+0

您介意詳細解釋解決方案嗎?與Q旁觀地圖調用中的內容有什麼不同?我面臨同樣的問題。 – mlt 2017-02-16 22:32:56

1

不幸的是,ActiveRecord不僅僅將任何選定的列與模型上的屬性進行匹配。然而,類似的東西可能相當容易放在一起。首先你需要重載find_by_sql到這樣的事情 -

def self.find_by_sql(sql) 
    values = connection.select_all(sql) 

    objects = [] 

    values.each do |row| 
     objects << self.new(row) 
    end 

    objects 
end 

然後爲您模型質量分配基於模式的屬性,然後分配處理您的自定義屬性初始化函數。它不像你可能希望的那樣簡單或簡單,但它應該完成任務。你也許可以編寫初始化函數,使它相當通用,因爲它可以批量分配所有基於模式的屬性,然後匹配傳入的剩餘密鑰和可能存在於self上的任何屬性。

+0

確定嗎?我發現了以下內容:www.railsrocket.com/find_by_sql,他說我可以做到這一點 – Tony 2013-02-15 21:49:39

+0

我很抱歉,我不知道這個功能 - 我使用的版本相當老舊,所以可能是問題所在。但是,如果按照該文章中的描述進行工作,您的問題到底是什麼? – 2013-02-15 21:58:00

+0

問題是,它不工作:)。我不確定attr_accessor是否正常?我怎樣才能訪問屬性? – Tony 2013-02-15 22:01:35