[英]undefined method `to_f' for #<ActiveRecord::Relation:0x472d0a0>
I'm trying to build a call tracking app as a way to learn rails and twilio. 我正在尝试构建一个呼叫跟踪应用程序,作为学习rails和twilio的一种方式。 Right now, what I'd like to do is to make a graph that shows the number of phone calls a particular phone gets every day.
现在,我想做的是制作一个图表,显示每天特定手机的电话数量。
The way my data structure is set up, is that the phone model has_many calls. 我的数据结构的设置方式是手机型号有多次调用。
In my Phone Model, I have 在我的手机型号中,我有
def total_on(date)
self.calls.where("placed_at >= ? AND placed_at <= ?", date.beginning_of_day, date.end_of_day)
end
In my view, I have the following javascript : 在我看来,我有以下javascript:
<script type="text/javascript" charset="utf-8">
$(function () {
new Highcharts.Chart({
chart: { renderTo: 'calls_chart' },
title: { text: 'Calls Per Day' },
xAxis: { type: 'datetime' },
yAxis: {
title: { text: ' Calls'}
},
series: [{
name: "<%= @phone.name %>",
pointInterval: <%= 6.days * 1000 %>,
pointStart: <%= 1.month.ago.at_midnight.to_i * 1000 %>,
data: <%= (1.month.ago.to_date..Date.today).map { |date| @phone.total_on(date).to_f}.inspect %>
}]
});
});
The important part is the data: 重要的部分是数据:
<%= (1.month.ago.to_date..Date.today).map { |date| @phone.total_on(date).to_f}.inspect %>
when I try to place the data for calls on each day, I get the error 当我尝试在每天拨打电话数据时,我收到错误
undefined method `to_f' for #<ActiveRecord::Relation:0x472d0a0>
I'm not really sure if I'm doing anything right here, to be honest. 老实说,我不确定我是否在这里做任何事情。 A fellow stackoverflower helped me make the Instance Method I referenced above, so I'm assuming that's a lot better than what I wrote.
一个伙伴stackoverflower帮助我制作了上面提到的实例方法,所以我假设它比我写的要好很多。
So, what would I need to change to make it so that I can call the number of phone calls made on a particular date, in the view? 那么,我需要改变什么才能在视图中调用特定日期的电话号码?
UPDATE UPDATE
After Zack's answer, I now get the error 在Zack回答之后,我现在得到了错误
SQLite3::SQLException: no such column: calls.placed_at: SELECT COUNT(*) FROM "calls" WHERE "calls"."phone_id" = 44 AND ("calls"."placed_at" BETWEEN '2012-09-11 00:00:00.000000' AND '2012-09-11 23:59:59.999999')
Probably I'm confusing the associations I have or something. 可能我混淆了我所拥有的关联或其他东西。 Here are the models with the data structure, if they help --
以下是具有数据结构的模型,如果它们有帮助 -
Phone Model 手机型号
# == Schema Information
#
# Table name: phones
#
# id :integer not null, primary key
# name :string(255)
# twilio_number :integer
# original_number :integer
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Phone < ActiveRecord::Base
attr_accessible :original_number, :user_id, :name, :twilio_number
belongs_to :user
has_many :calls, dependent: :destroy
validates :name, presence: true
validates :twilio_number, presence: true
validates :original_number, presence: true
validates :user_id, presence: true
default_scope order: 'phones.created_at DESC'
validate :check_phone_limit, :on => :create
def check_phone_limit
if User.find(self.user_id).at_max_phone_limit?
self.errors[:base] << "Cannot add any more phones"
end
end
def original_number=(value)
num = value.to_s.gsub(/[^0-9+]/, "")
write_attribute(:original_number, num.to_i)
end
def total_on(date)
self.calls.where(placed_at: date.beginning_of_day..date.end_of_day).count
end
end
Call Model 呼叫模型
# == Schema Information
#
# Table name: calls
#
# id :integer not null, primary key
# AccountSid :string(255)
# From :string(255)
# To :string(255)
# CallStatus :string(255)
# ApiVersion :string(255)
# Direction :string(255)
# FromCity :string(255)
# FromState :string(255)
# FromZip :string(255)
# FromCountry :string(255)
# ToCity :string(255)
# ToState :string(255)
# ToZip :string(255)
# ToCountry :string(255)
# CallSid :string(255)
# DialCallSid :string(255)
# DialCallDuration :string(255)
# DialCallStatus :string(255)
# RecordingUrl :string(255)
# phone_id :integer
# DialCallMinutes :integer
# created_at :datetime
# updated_at :datetime
#
class Call < ActiveRecord::Base
attr_accessible :AccountSid, :From, :To, :CallStatus, :ApiVersion, :Direction, :FromCity, :FromState, :FromZip, :FromCountry, :ToCity, :ToState, :ToZip, :ToCountry, :CallSid, :DialCallSid, :DialCallDuration, :DialCallStatus, :RecordingUrl, :DialCallMinutes
belongs_to :phone
def self.create_from_incoming_call(params)
user_phone = Phone.find_by_twilio_number(params['To']) #Finds the phone number in the database based on what phone Twilio is calling
twilio_request_params = {
:CallSid => params['CallSid'],
:AccountSid => params['AccountSid'],
:From => params['From'],
:To => params['To'],
:CallStatus => params['CallStatus'],
:ApiVersion => params['ApiVersion'],
:Direction => params['Direction'],
:FromCity => params['FromCity'],
:FromState => params['FromState'],
:FromZip => params['FromZip'],
:FromCountry => params['FromCountry'],
:ToCity => params['ToCity'],
:ToState => params['ToState'],
:ToZip => params['ToZip'],
:ToCountry => params['ToCountry']
}
call = Call.new(twilio_request_params)
call.save
return call
end
def Call.update_dial_call(params)
twilio_request_params = {
:DialCallSid => params['DialCallSid'],
:DialCallDuration => params['DialCallDuration'],
:DialCallStatus => params['DialCallStatus'],
:RecordingUrl => params['RecordingUrl'],
:DialCallMinutes => (params['DialCallDuration'].to_f/60.to_f).ceil
}
call = Call.where( :CallSid => params['CallSid'] ).first
call.update_attributes twilio_request_params
call.save
end
end
Phone Show Action 电话节目行动
def show
@user = current_user
@phone = Phone.find_by_id(params[:id])
@calls = @phone.calls.paginate(page: params[:page])
end
And, the javascript in the view ( repeated for easier reading) 并且,视图中的javascript(重复以便于阅读)
<script type="text/javascript" charset="utf-8">
$(function () {
new Highcharts.Chart({
chart: { renderTo: 'calls_chart' },
title: { text: 'Calls Per Day' },
xAxis: { type: 'datetime' },
yAxis: {
title: { text: ' Calls'}
},
series: [{
name: "<%= @phone.name %>",
pointInterval: <%= 6.days * 1000 %>,
pointStart: <%= 1.month.ago.at_midnight.to_i * 1000 %>,
data: <%= (1.month.ago.to_date..Date.today).map { |date| @phone.total_on(date).to_f}.inspect %>
}]
});
});
</script
> >
Your total_on
method is returning an association, not a number. 你的
total_on
方法返回一个关联,而不是一个数字。
Try appending .count
: 尝试附加
.count
:
def total_on(date)
calls.where("placed_at >= ? AND placed_at <= ?", date.beginning_of_day, date.end_of_day).count
end
You can also give it a date range to shorten the method a bit (effectively the same, but easier to read): 你也可以给它一个日期范围来缩短方法(实际上相同,但更容易阅读):
def total_on(date)
calls.where(placed_at: date.beginning_of_day..date.end_of_day).count
end
Update: 更新:
Did the original "placed_at" query ever work, or was it never actually called because of the NoMethodError
? 原始的“placement_at”查询是否有效,或者由于
NoMethodError
而从未实际调用NoMethodError
?
It doesn't look like there is a placed_at
column in your model, but I assume you can used created_at
just as well. 它看起来不像你的模型中有一个
placed_at
列,但我想你也可以使用created_at
。
If you want to used placed_at
, you could define this method (I changed the name to placed_on
for style): 如果你想使用
placed_at
,你可以定义这个方法(我把名字placed_on
为了样式的placed_on
):
class Call < ActiveRecord::Base
def self.placed_on(date)
where(created_at: date.beginning_of_day..date.end_of_day)
end
end
You can chain this into your total_on
method: 你可以将它链接到你的
total_on
方法:
class Phone < ActiveRecord::Base
def total_on(date)
calls.placed_on(date).count
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.