Ruby on Rails: 从哪里查询设置列变量?
Ruby on Rails: Setting column variable from where query?
用户模型中的签入、签出方法
def check_in(meeting)
if meeting.nil?
false
elsif Attendance.where({user: self, meeting: meeting}).any?
false
else
attendance = Attendance.create({user: self, meeting: meeting})
attendance.in_time = Time.now
end
end
def check_out(meeting)
if meeting.nil?
false
else
attendance = Attendance.where({user: self, meeting: meeting})
attendance.present = true
attendance.out_time = Time.now
end
end
rspec 用户模型测试
describe 'check_out' do
before(:each) do
@user = FactoryGirl.create(:user)
@meeting = FactoryGirl.create(:meeting)
@user.check_in(@meeting)
expect(@meeting.users).to include @user
expect(@user.meetings).to include @meeting
end
it 'checks out the user' do
expect(@user.check_out(@meeting)).to be_truthy
end
end
失败日志
Failures:
1) User check_out checks out the user
Failure/Error: expect(@user.check_out(@meeting)).to be_truthy
NoMethodError:
undefined method `present=' for #<ActiveRecord::Relation []>
# ./app/models/user.rb:84:in `check_out'
# ./spec/models/user_spec.rb:127:in `block (3 levels) in <top (required)>'
我有一个包含列的出勤模型:id (int), user_id (int), meeting_id (int), in_time (time), out_time (时间),现在(布尔值)。
用户 has_many 次出席和 has_many 次出席会议。
通过出席会议 has_many 出席和 has_many 用户。
用户和会议的出席人数 belongs_to。
当用户签到时,它使用 check_in 方法并记录他们的时间。当他们 check_out 时,它 运行 使用 check_out 方法,这它确认他们的出席并记录他们的超时。 check_in 运行 的测试完美无缺,但是 check_out 却失败了?
我的问题是我将 where 查询分配给变量的方式是否有误(抱歉使用术语,我真的是新手)以及我是否错误地分配了列(因为它将列计为一个方法?)如果
我不知道出了什么问题,如果有人能帮我解决这个问题就太好了,谢谢。 :]
问题只是这一行 returns 是出席人数的集合,而不是只有一个出席人数:
attendance = Attendance.where({user: self, meeting: meeting})
您可以简单地在末尾添加 .first 以使其获取第一个,如下所示:
attendance = Attendance.where({user: self, meeting: meeting}).first
或像这样使用 find_by
方法:
attendance = Attendance.find_by({user: self, meeting: meeting})
之后,您将在出勤对象而不是集合上调用 attendance.present = true
。
用户模型中的签入、签出方法
def check_in(meeting)
if meeting.nil?
false
elsif Attendance.where({user: self, meeting: meeting}).any?
false
else
attendance = Attendance.create({user: self, meeting: meeting})
attendance.in_time = Time.now
end
end
def check_out(meeting)
if meeting.nil?
false
else
attendance = Attendance.where({user: self, meeting: meeting})
attendance.present = true
attendance.out_time = Time.now
end
end
rspec 用户模型测试
describe 'check_out' do
before(:each) do
@user = FactoryGirl.create(:user)
@meeting = FactoryGirl.create(:meeting)
@user.check_in(@meeting)
expect(@meeting.users).to include @user
expect(@user.meetings).to include @meeting
end
it 'checks out the user' do
expect(@user.check_out(@meeting)).to be_truthy
end
end
失败日志
Failures:
1) User check_out checks out the user
Failure/Error: expect(@user.check_out(@meeting)).to be_truthy
NoMethodError:
undefined method `present=' for #<ActiveRecord::Relation []>
# ./app/models/user.rb:84:in `check_out'
# ./spec/models/user_spec.rb:127:in `block (3 levels) in <top (required)>'
我有一个包含列的出勤模型:id (int), user_id (int), meeting_id (int), in_time (time), out_time (时间),现在(布尔值)。
用户 has_many 次出席和 has_many 次出席会议。
通过出席会议 has_many 出席和 has_many 用户。
用户和会议的出席人数 belongs_to。
当用户签到时,它使用 check_in 方法并记录他们的时间。当他们 check_out 时,它 运行 使用 check_out 方法,这它确认他们的出席并记录他们的超时。 check_in 运行 的测试完美无缺,但是 check_out 却失败了?
我的问题是我将 where 查询分配给变量的方式是否有误(抱歉使用术语,我真的是新手)以及我是否错误地分配了列(因为它将列计为一个方法?)如果
我不知道出了什么问题,如果有人能帮我解决这个问题就太好了,谢谢。 :]
问题只是这一行 returns 是出席人数的集合,而不是只有一个出席人数:
attendance = Attendance.where({user: self, meeting: meeting})
您可以简单地在末尾添加 .first 以使其获取第一个,如下所示:
attendance = Attendance.where({user: self, meeting: meeting}).first
或像这样使用 find_by
方法:
attendance = Attendance.find_by({user: self, meeting: meeting})
之后,您将在出勤对象而不是集合上调用 attendance.present = true
。