所以说,我现在才看到,是已经晚了么?
#39 楼 @yueyeweiming 哈哈 (⊙o⊙)
#1 楼 @yueyeweiming 买包送笔记本可好?
#5 楼 @marksloan 你们是采用的下单即更新库存的方式?如果是一定要这么做的话,可以考虑用 sidekiq,然后设定 24 小时后检查这张订单。如果是在失效时间内已经支付,可以同时从定时队列中移除这个任务。
首先定义一个“苦逼”的 worker 来干活:
# app/workers/order_expiration_checker.rb
class OrderExpirationChecker
include Sidekiq::Worker
def perform(id)
order = Order.find id
do_some_stuff if order.unpaid? && order.expired? # 订单未支付,并且已经超过有效期
end
end
然后在每次下单时,自动将订单加入定时任务,24h 后执行检查:
# app/models/order.rb
class Order < ActiveRecord::Base
after_create :check_expiration
def expired?
created_at + 24.hours < Time.now
end
private
def check_expiration
OrderExpirationChecker.perform_in(24.hours, id)
end
end
#3 楼 @tracyzhang 嗯嗯,怎么解决怎么来。
#1 楼 @tracyzhang merit 蛮赞的,但是不足的是需要分散地关注各种 action。可以考虑另一种思路,就是用 auditing 相关的技术监视积分改变 (积分改变才是问题根源),每次记录下改变原因。相关的 gem 有: https://github.com/airblade/paper_trail 以及 https://github.com/chaps-io/public_activity 。我去年用过 paper_trail 实现了一套员工的积分系统。结合 i18n 之类的可以实现非常灵活的积分登记系统。
过来帮顶,看了社区,觉得还是需要设计一下,不然跟官网风格差得也太远了。
另外研究了下, #4 楼 @huhongda 提到的 where_values
方法其实也是回归到了 Arel 的方式,因为 ActiveRecord::Relation#where_values
的源码如下:
def #{name}_values # def select_values
@values[:#{name}] || [] # @values[:select] || []
end # end
其中 @values
里边实际上就存储了很多 QueryMethod 需要用到的 Arel 节点 ( Arel::Nodes::Equality 等类型实例)。
所以 where_values
方法其实返回的就是一个由 Arel::Nodes::Equality
类型的实例组成的数组,跟我上边提到的这段代码返回的内容在结构上是一致的:
condition = search_fields.map do |field|
User.arel_table[field].matches("%#{search}%")
end
唯一不同的只是直接用 Arel 写还可以在查询中使用通配符 %
。
Arel 是 Rails 里边用来管理生成 AST (Abstract Syntax Tree 抽象语法树) 的组件,负责最底层的 SQL 语句生成,使用 Arel 能够获得更高的灵活度。这个代码明显用 arel 重构就可以了:
def search_user # Ruby 代码规范中,方法名跟局部变量命名都建议使用下划线形式
search, offset, rows = *params.values_at(:search, :offset, :limit)
search_fields = %w(user_id user_name password gender device_name os_name os_version device_id user_type)
# 每个待查询字段都会有一个对应的 matches 匹配条件,最后这些条件之间用 `or` 运算合并,语义即“user_id matches xxx or user_name matches xxx or ...”
condition = search_fields.map do |field|
User.arel_table[field].matches("%#{search}%") # matches 的源码请看 https://github.com/rails/arel/blob/master/lib%2Farel%2Fpredications.rb#L121-L123
end.inject(:or)
# 使用 Arel 构造的查询子句可以直接用于更高层级的 Query Method,也就是 `where` 方法
users = User.where(condition).offset(offset).limit(rows)
result = {:total => User.count, :rows => users}
render json: result
end
分开 layout + 文件夹维护,比如
- layouts
|- responsive.html.erb
|- fixed.html.erb
<!-- app/views/layouts/reponsive.html.erb -->
<%= javascript_include_tag "responsive" >
<%= stylesheet_link_tag "responsive" >
<!-- app/views/layouts/fixed.html.erb -->
<%= javascript_include_tag "fixed" >
<%= stylesheet_link_tag "fixed" >
- assets
|- stylesheets
|- responsive
|- file1.css.scss
|- file2.css.scss
|- fixed
|- file1.css.less
|- file2.css.less
|- reponsive.css
|- fixed.css
|- javascript
|- responsive
|- file1.js.coffee
|- file2.js.coffee
|- fixed
|- file1.js
|- file2.js
|- responsive.js
|- fixed.js
/* app/assets/stylesheets/responsive.css */
require_tree ./reponsive
当然了,以上只是解决现有的问题,最好还是制定团队规范。
感觉还不如就直接用 Rails 提供的 FormHelper 呢,不过确实感觉 simple_form 很尴尬,简单场景不需要,复杂场景不灵活。
可以,找一下 POP3 的实现就行了,比如 Ruby 内置的: http://ruby-doc.org/stdlib-2.1.0/libdoc/net/pop/rdoc/Net/POP3.html
require 'net/pop'
pop = Net::POP3.new('pop.example.com')
pop.start('YourAccount', 'YourPassword') # (1)
if pop.mails.empty?
puts 'No mail.'
else
i = 0
pop.each_mail do |m| # or "pop.mails.each ..." # (2)
File.open("inbox/#{i}", 'w') do |f|
f.write m.pop
end
m.delete
i += 1
end
puts "#{pop.mails.size} mails popped."
end
pop.finish # (3)
- Call #start and start POP session.
- Access messages by using #each_mail and/or #mails.
- Close POP session by calling #finish or use the block form of start.
如果要找第三方库,或许这个可以考虑: https://github.com/mikel/mail#getting-emails-from-a-pop-server
#22 楼 @allenfantasy 你给大家卖个萌吧
#20 楼 @theblock24block 上届是,这届不好说。毕竟这次主题特别
#### 开题
2015年五月Open Party和武汉酷热的天气一样来袭了!!!
继“老腊肉”们的《十年的程序人生》后,Open Party迎来了三位全新的“小鲜肉”。
本期三位Speaker来头可不小,他们带来的话题是否能激发起你对技术的热情呢?
Open Party是我们共同的平台!快来一起畅言吧~
那么,问题来了!
2015年转眼就要过半了,你这半年有什么收获吗?赶快与我们一起分享下把!
本期Open Party 报名和讲师征集同步进行,
最近学习有心得,总结一下来和大家分享吧!
最近工作有收获,总结一下来和大家分享吧!
未来学习新规划,总结一下来和大家分享吧!
**总结与分享,是成功的奠基石!**
#### MAY 2015〡武汉Open Party 活动安排
**时间:** 2015年5月23日 周六 13:00 - 17:00
**地点:** 光谷世界城广场1516 Thoughtworks武汉办公室
##### Part1:话题分享 13:20 - 15:40
**Topic1. 分布式系统架构与性能调优** (李涛 任职于 武汉智慧科力信息技术有限公司 创始人之一,技术团队负责人。全栈程序员 5年java web经验,擅长团队建设、应用细节设计、日志设计与分析、性能调优)
* 介绍分布式系统构建经验,深入分享性能调优细节
* 引导程序员合理设计应用日志
* 简单介绍web安全策略
**Topic 2: rack middleware 是如何工作的?** (覃(qin)明圆,4年Ruby开发经验,Full-Stack工程师多年Devops经验,喜欢编程,喜欢新事物,能跟随新技术,有轻微代码洁癖 ,同事送绰号“源码菜” 。一位中医大学毕业的Ruby程序员)
* 性能更高(更小的内存占用,解释为什么)
* 更好的自省,可以更精确的知道某个任务执行的各个环节
* 更低的学习和使用成本
**Topic3:跨平台手机游戏开发** (于浩洋,曾就职于阿里巴巴、人人网,从事多年互联网产品开发工作。参与主导《全民动漫》《乱世江湖》和《dtHero》多款卡牌手游的开发与发行,有丰富的手游开发经验。出版书籍《Cocos2d-x 3.X手游开发实例详解》)
* 介绍手游开发框架cocos2d-x,环境搭建,以及如何使用cocos2d-x创建helloWorld
##### Part2:Open Talk 嘉宾访谈,讨论 15:50 - 17:00
**内容:**讲讲是什么原因让你对这一特定知识进行深入的了解
#### 最后
大家还记得上次激烈的讨论场景吗?
上次讨论你认真在听,因为害羞没有勇敢表达内心想法吗?
机会再次来到你的面前,放下害羞,放下忐忑,放下成见,勇敢的发声吧!
社区期待听到每一个人的声音!
**5月23号**,我们不见不散咯。
[报名链接](https://jinshuju.net/f/bptlCn#rd)
#1 楼 @jobthoughtworks 我帮你排版了下,别打我!后边贴源文。。。要是有感觉不当之处,我自觉删下。
2015 年五月 Open Party 和武汉酷热的天气一样来袭了!!! 继“老腊肉”们的《十年的程序人生》后,Open Party 迎来了三位全新的“小鲜肉”。 本期三位 Speaker 来头可不小,他们带来的话题是否能激发起你对技术的热情呢? Open Party 是我们共同的平台!快来一起畅言吧~
那么,问题来了! 2015 年转眼就要过半了,你这半年有什么收获吗?赶快与我们一起分享下把!
本期 Open Party 报名和讲师征集同步进行, 最近学习有心得,总结一下来和大家分享吧! 最近工作有收获,总结一下来和大家分享吧! 未来学习新规划,总结一下来和大家分享吧!
总结与分享,是成功的奠基石!
时间: 2015 年 5 月 23 日 周六 13:00 - 17:00 地点: 光谷世界城广场 1516 Thoughtworks 武汉办公室
Topic1. 分布式系统架构与性能调优 (李涛 任职于 武汉智慧科力信息技术有限公司 创始人之一,技术团队负责人。全栈程序员 5 年 java web 经验,擅长团队建设、应用细节设计、日志设计与分析、性能调优)
Topic 2: rack middleware 是如何工作的? (覃(qin)明圆,4 年 Ruby 开发经验,Full-Stack 工程师多年 Devops 经验,喜欢编程,喜欢新事物,能跟随新技术,有轻微代码洁癖,同事送绰号“源码菜” 。一位中医大学毕业的 Ruby 程序员)
Topic3:跨平台手机游戏开发 (于浩洋,曾就职于阿里巴巴、人人网,从事多年互联网产品开发工作。参与主导《全民动漫》《乱世江湖》和《dtHero》多款卡牌手游的开发与发行,有丰富的手游开发经验。出版书籍《Cocos2d-x 3.X 手游开发实例详解》)
内容:讲讲是什么原因让你对这一特定知识进行深入的了解
大家还记得上次激烈的讨论场景吗? 上次讨论你认真在听,因为害羞没有勇敢表达内心想法吗? 机会再次来到你的面前,放下害羞,放下忐忑,放下成见,勇敢的发声吧! 社区期待听到每一个人的声音!
5 月 23 号,我们不见不散咯。