我有一个用于我的用户模型的rails应用程序。在我的应用中,用户可以通过注册注册课程。我添加了hour_learned和hours_taught。注册后,我尝试将学习时间添加到当前用户,但由于某种原因,它将无法正常工作。我没有得到任何错误,但它只是不会插入到数据库中。我的用户模型中有一个注册方法,如下所示:
def enroll!(course, user)
enrollments.create!(:course_id => course.id, :active => true)
user.hours_taught = user.hours_taught + (course.hours_long)
end
是的,我确保属性可以访问。仍然没有去。任何帮助将非常感激。
答案 0 :(得分:1)
为什么您在User
模型上定义的此方法将user
对象作为参数?你应该这样定义:
def enroll!(course)
enrollments.create!(:course => course, :active => true)
self.hours_taught = self.hours_taught + (course.hours_long)
self.save!
end
此方法将被定义为此类的实例方法,因此您可以像这样调用它:
user.enroll!(course)
这意味着您不需要将此方法作为参数传递给用户。在方法内部,我们获取course
对象并将其分配给注册,执行小时数学运算,然后使用save!
保存它,如果reocrd无效,则会引发异常(ActiveRecord::RecordInvalid
1}}或ActiveRecord::RecordNotSaved
)
答案 1 :(得分:0)
你得到什么错误信息?
此外,通常模型的实例方法不包含obj本身的参数。在模型中使用self
。例如
class User << ActiveRecord::Base
...
def enroll!(course)
enrollments.create!(:course_id => course.id, :active => true)
self.hours_taught = self.hours_taught + (course.hours_long)
save!
end
...
已添加为何需要保存...
请记住,ActiveRecord确实在两个地方跟踪其模型的数据:“内存”和数据库系统。
由于保存/更新记录的数据库副本在时间上很昂贵,因此您可能希望对记录的内存中版本进行一些更新,然后将其保存到数据库中。
或者,根据具体情况,您可能希望针对模型的给定操作是原子的,并且包括将更新的模型保存到数据库中。
在此示例中,您已将方法命名为enroll!的!是一个约定,暗示你想要注册! “全部做”的方法,包括更新数据库。
因此,在方法本身中,您需要将数据保存到dbms。
在对象的方法中包含save
的问题在于,您可能最终会对数据库进行更多保存,然后才真正需要。最好一次保存多个更改,而不是对数据库进行多次保存。但是你不想把自己扭曲成结以最小化节省。 - 在计划sw流程时,请记住这个问题。