我来做的话,会选择用多一次查询:
Topic.find (Topic.pluck(:id) - current_user.answered_topic_ids).sample
ActiveRecord 有 Optimistic Locking,设置 lock_version 即可
用 Hash 来替换 case when 是常见的重构方法:
h = Hash.new(:opened).merge('closed' => :closed, 'foo' => :foo, 'bar' => :bar)
Project.includes(:todos).sorted_by_alias_asc.send(h[params[:filter]])
常见面试题: https://leetcode.com/problems/factorial-trailing-zeroes/
n = 1000
[1,2,3,4].map{|i| n / 5 ** i}.inject(:+)
换个方式,用现成的 ^_^ gem 'rack-heartbeat'
负责部署的机器应该可以同时访问 2 个网络吧,在这台机器上做个 ssh reverse tunnel 就好了
9 行 Ruby 求平均值的算法搞定 11600 分,有空用拟合算法试试看
这个加分题有意思,值得一战
果然,后来又被加回来了 https://github.com/rails/sprockets/pull/193
2 个项目的 gem 版本不一样吧
在某个版本被移除了,官方说法是服务器(nginx/apache) 都提供了动态压缩,觉得没必要生成一个 gz 文件,就算一些 CDN 需要静态缓存,也只要额外执行一行命令,还可以让用户自己选择用什么压缩命令和压缩等级(推荐 zopfli,压缩率最高,但是压缩速度最慢),所以被移除了。
关于 SSH 密钥,我在以前项目中是通过将用户上传的公钥保存在数据库,然后 sshd 通过配置 AuthorizedKeysCommand 和 AuthorizedKeysCommandRunAs 执行相关的脚本从数据库获取公钥,这个方案比多服务器同步更简单
不用考虑效率的写法:
keywords.any?{|k| string.include?(k)}
好想为这个项目写代码啊,支持远程么?
按原来的样子去掉<%就可以了
div class="alert alert-#{message_type}"
= message
#44 楼 @numbcoder 换个角度思考,如果 rails 配合一个 controller 层面的参数校验 gem,比如 https://github.com/nicolasblanco/rails_param ,是不是就和 grape 一样很方便做 api 了?或者根据项目需求,类似我举的 ransack 扩展,是不是就比 grape 更灵活?
其实归结到一句正确的废话,对于 grape vs rails api,或者 webpack vs asset pipeline 等类似问题,答案都是你熟悉哪个用哪个,哈哈哈哈
#35 楼 @42thcoder RESTful api 关于 create/update api 数据校验是在 model 做的,关于 read/delete by id,这个并没有什么可说的。
你举的关于复合查询 api,我通常会选择引入 ranksack ( https://github.com/activerecord-hackery/ransack ) ,然后写一个 hash 的 filter 扩展方法,用起来是这样:
params.ransack_filter!(title: :cont, code: :eq, id: :eq, state: {predicate: :eq, values: [:closed, :done]})
Order.search(params)
不过不满足你例子里面的 dsl all_or_none_of,需要再做一些扩展,和 grape 的 dsl 相比,缺点是文档和代码不同步,优点是 2 行代码可以搞定(包括查询)
#37 楼 @numbcoder #38 楼 @jicheng1014 根据 id 或者根据 email 来查找,通过验证格式来减少数据库查询,这个是否要做,完全看项目需求和编码规范。
但是 order by 或者其他查询直接依赖传入参数如果不做校验的话,不单单是潜在的性能 DDOS 问题,还有 sql 注入问题,这不是新手的问题,或者说是 rails、grape 的选择依据,完全是因为没有意识到这里的安全问题导致
#40 楼 @huacnlee 用户页面错误应该是这里查询改成等号就好了:
https://github.com/ruby-china/ruby-china/blob/master/app/models/user.rb#L196
where(login: slug).first || fail(ActiveRecord::RecordNotFound.new(slug: slug))
手工点赞 +1
2001 年,上海,3000,最大的福利是 15 天的年假...
白名单没有考虑属性的内容,如果有需求,可以自定义 scrubber,不需要引入额外的 gem
sanitize(html, scrubber: CustomPermitScrubber.new)
class CustomPermitScrubber < Rails::Html::PermitScrubber
def scrub(node)
node.remove if node.name == 'a' && node["href"].present? && !node["href"].start_with?('http')
super
end
end
你执行 mina setup 以后会帮你创建好 shared 目录,这个目录下面有 config/database.yml 检查一下吧
mina 的 database.yml 是需要另外 link,而不是 git pull 下来的,是不是 link 的文件里面没有配置 production 的数据库?
我的解法,用一个 hash 来保存最右侧字符的 index,可以减少判断时间
def remove_duplicate_letters(s)
cs, r = s.chars, []
h = cs.map.with_index.to_h
cs.each_with_index do |c, i|
unless r.include?(c)
r.pop while r.last && c < r.last && i < h[r.last]
r << c
end
end
r.join
end