全栈工程师成长记

编程重新定义人生

写了一天 8/27日记

写了一天 8/27日记

Objective
完成:
1.写6篇博文
2.课前初级练习按投票数排序功能

Reflective
情绪:表示基本稳定
低点:晚上花了3个小时捣鼓投票排序功能,感觉自己弱爆了

Interpretive
学到:
action里对数据写入没产生实际变动?加个.save试试。

领悟:
从早上7点到晚上7点,除了吃午饭和晚饭(都是叫外卖),所有时间都在写博客,主要是整理近期的一些收获。算起来差不多11个小时写了5篇博客(不包括本篇),这个效率当然不能算高,写得慢的原因在于有些细节需要回忆才能想起,而有些资料或说法则要进行搜索确认。花这么长的时间写博客,却又没几个订阅,那么较真干嘛呢?这当然是有原因的。

写作是“输入 > 处理 > 输出”的过程,我要做的就是把自己的学习所得和感悟通过写作的方式完成这个过程。通常我们在看书、看电影、听讲座、与人聊天等等情况下无一不在进行输入(亦即意味着我们随时都可以学习),大部分人很少进行处理和输出,小部分人进行处理但不输出,只有更小一部分的人既处理又输出。举个例子,一部十几亿票房的电影,观影人次几千万,真正写影评或者观后感的人有几个?

在写了5篇博客并在 ontrack 上提交了3篇作业链接之后,ontrack 首页的课程进度条再一次提醒我,课前初级练习还有1份作业没完成,第三周作业还有5份作业没完成。于是心想先挑起看起来简单一点的初级练习来做吧,可接下来的事实证明这一点都不简单。

作业的要求是在首页按照 Topic 的投票数量进行排序,现在分别有topicsvotes两个 table ,它们的关系是:

topic has_many :votes
vote belongs_to :topic

过去几个星期做过两次排序功能,一个 Group 的 post 按照发表时间排序,一个是 joblisting 的 job 按照薪资上限/下限排序。按照时间的排序比较简单,每个 table 项本身就自带 created_at 栏位,所以使用 order("created_at DESC) 就能快速实现。而 job 按照薪资上限/下限排序的话,这两个选项有各自对应的栏位 wage_upper_bound wage_lower_bound,所以依旧可以通过以下两个方法实现:

order('wage_lower_bound DESC')
order('wage_upper_bound DESC')

回过头看初级项目的 votes table ,仅有"topic_id" 栏位是手动创建的,用于表示和 topic 的关联。没有统计的字段,但是在 topics 首页对投票项进行投票之后,却能显示相应的票数,那这是怎么实现的呢,查看 topic/index 的代码,发现这一句
<%= pluralize(topic.votes.count,"vote")%>
这里的.count就是关键所在了,可是这个 count 从哪里来?我现在的理解是它是内建函数,就像create 、new一样。可是怎么用呢,反正order('topic.votes.count DESC')是不行的,其实最怕就是不知道语法,不知道写什么,怎么写。

然后又开始谷歌找各种答案,开始各种折腾。最后放弃直接使用 topic.votes.count 这个内建的方法,参考 wage_upper_bound 的方法给 topics 增加了一个 votes_count 的栏位,设想是在通过@topic.votes.create进行投票之后,向 votes_count 的栏位写入+1的数据

  def upvote
    @topic = Topic.find(params[:id])
    @topic.votes.create
    @topic.votes_count += 1
    redirect_to(topics_path)
  end

但是点击投票按钮之后,votes有新增投票记录,votes_count 的数值却完全没有跟着改变,还是默认的0。于是用了YY老师讲的pry排错法,在rails s的实时环境里,通过命令行输入 @topic.votes_count += 1 可以看到输出的结果是数据有叠加上去,但为什么在 rails s 的 log 里完全看不到 topic 的变动。我一度开始怀疑人生,看起来自己好像也写过一些更加高级功能,怎么连这个老师安排在初级课程里的作业都搞不定呢?反思让人清醒,我决定回头看jdstore里当时关于购物车商品数量的加减是怎么写的:

   self.quantity += 1
   self.save

其中的self.save让我心生一计,难道我是因为我没有保存?
于是加了一行@topic.save,果然生效,不但votes_count被写入数据,首页也可以根据order("votes_count DESC")进行排序了。

  def upvote
    @topic = Topic.find(params[:id])
    @topic.votes.create
    @topic.votes_count += 1
    @topic.save
    redirect_to(topics_path)
  end

在为自己解决了一个问题感到高兴的同时,一丝隐忧也随之而来,我察觉到自己的基础知识还是不够牢固,在接下里的项目实战里,除了做前端,代码的能力也不能落下,要多加练习和巩固才行。

Decisional
形容:这篇日记又花了一个半小时,现在已快到凌晨1点,这一天算是可以结束了。
努力:做Langding page。