LZ 既然能改变世界,为什么非要花这么多时间在这里跟你眼中的“智障”撕
我觉得跑个脚本处理一下旧数据比较好吧
最近在项目上用上 graphql 了,感觉 graphql-ruby 已经比较完善,用起来没遇到什么较大的问题。而且 graphql 是支持自省的,因此生成文档很方便,假如前端熟悉 graphql 的话甚至不需要文档。所以就不用担心文档忘了更新的情况了。要说缺点的话,目前我觉得最大的问题就是 Graphql 的过于复杂,非常多的定义,从啃文档到开始实现花了我两天多的时间 。我认为这也是 graphql 并不怎么火的原因,后端去定义一套 Schema 需要理解 Graphql 大部分定义,否则用起来可能还没直接写 API 方便。(PS:之前也用过API expand的方式去提升接口灵活性,但一方面自己开发还是比较花时间的,另外灵活性也比不上 graphql,所以比起来我认为 graphql 更好)
http://guides.ruby-china.org/i18n.html (PS:这是 rails5.0 版本的文档,可能跟其他版本有些不同)
最近也在开发环境下试了一下,不用搭环境了确实很方便,但是开发不太爽,例如 pry 用起来有点麻烦,mac 桌面版使用 volume 严重影响运行速度 (edge 版解决了,但 stable 还没发 )。现在项目使用 capistrano,还要把 ssh key mount 过去。使用webpack-dev-server
应该要另外配置 (这点还没看..)。不知道大家是怎样解决的~
用 passenger 的话,建议参考官网提供的文档安装,这样就可以使用包提供的 services 来启动和停止了
稍微看了一下options_for_select
的源码,如果你第二个参数传数组的话其实是变成将 value 为shipped
或apply_refunded
的选项选中。假如你想让 helper 来生成的话,建议不要使用数组来作为 value,否则只能用 js 来操作了。
从 log 看 state 的值被转成字符串了,看上去是 json 字符串,你可以在 controller 转成数组
JSON.parse(params[:state])
先检查一下渲染出来的表单 URL 是否正确
我看错了,以为你的参数是:file。现在的代码看不出问题,你贴下后台报什么错。
你把 log 贴一下
你用file_field
方法生成的 input 元素参数名会带上资源名称的,name 应该是web[file]
,所以你访问参数的话需要用 params[:web][:file]。另外file_field
方法会为外层form_for
生成的表单加上multipart/form-data
属性,所以你不用手动添加。参考文档
学到了
gitlab-ci 还没尝试过。Jenkins 也可以用 docker 简化环境配置,但假如把任务迁到另一个 Jenkins 上,确实是有不少东西要重新配置
支持
分母 + 1
vim + 1
。另外还可以加上 Rubocop 和 SimpleCov 的插件检测代码质量和测覆盖率。之前也用 jenkins + bitbucket 搭了这样的 CI 环境,可惜在团队里面推不起来
赞
ACzero
#5 楼 @hw676018683 噢噢,理解错意思了。可以这样写
B.select('a_id, COUNT(id) as match_count').where("(column1 = 'a' AND column2 = 100) OR (column1 = 'b' AND column 2 = 101)").group('a_id')
只有 match_count 等于 2(其实就是条件数)的记录才是满足所有条件的。
补充:
加上having
就能直接筛选出符合条件的记录了:
B.select('a_id, COUNT(id) as match_count').where("(column1 = 'a' AND column2 = 100) OR (column1 = 'b' AND column 2 = 101)").group('a_id').having('COUNT(id) >= 2')
B.where('(column1 = a AND column2 = 100) OR (column_1 = b AND column)') 这样能把需要的 A 都查出来了吧,条件再多也只要增加 where 的条件,不用增加查询次数。
看看get
的源码:
# https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/routing/mapper.rb#L650
def get(*args, &block)
map_method(:get, args, &block)
end
你说的两种写法传递的参数是不同的
get 'path', to: "controller#action"
# args = ["path", {:to => "controller#action"}]
get 'path' => 'controller#action'
# args = [{"path" => "controller#action"}]
往深一步看:
# https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/routing/mapper.rb#L687
def map_method(method, args, &block)
options = args.extract_options!
options[:via] = method
match(*args, options, &block)
self
end
# https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/routing/mapper.rb#L1470
# match 'path' => 'controller#action'
# match 'path', to: 'controller#action'
# match 'path', 'otherpath', on: :member, via: :get
def match(path, *rest)
......
end
match
方法太长就不贴了,extract_options!
是 rails 给 Array 扩展的方法,若数组对象最后一个元素是 hash 对象,就对这个数组调用pop
并返回pop
的返回值。实际上get
是在match
方法上做了一层封装。这样的话这两种写法传到match
方法的参数是这样的:
get 'path', to: "controller#action"
# path = "path"
# rest = [ { :to => "controller#action", :via => :get } ]
# 等于调用了 match "path", to: "controller#action", via: :get
get 'path' => 'controller#action'
# path = {"path" => "controller#action", :via => :get}
# rest = []
# 等于调用了 match "path" => "controller#action", via: :get
然后match
方法对这两张情况都做了处理,在这一段。实际上这两张写法都是一样的。不过正如 5 楼说的,ruby 从 1.9 后加入了{ key: 'value' }
这样的写法并推荐这样写,所以推荐上面那种写法
#3 楼 @pp158825968 放到 lib 里,然后在 config/application.rb 下将 lib 文件夹加到 rails 的加载路径中:
# config/application.rb
module YourAppName
class Application < Rails::Application
# 将lib文件夹加到rails的加载路径中
config.autoload_paths << Rails.root.join('lib')
end
end
这样的话不需要执行require 'bill_test'
也能直接使用了
一般都标的是税前,除了税收外个人还要交一部分社保,到手多少要自己算