同意楼上。不建议在遍历过程中改变原数组的长度
screen -S xxx 创建具名终端,进入该终端进行操作,相当于在后台启动了一个终端。即使 ssh 断开,重新连接后使用 screen -r xxx 进入原具名终端
估计你想要所有的 api 请求跳过 csrf 验证,建议抽一个 api 的 base 类,在其中直接skip_before_action :verify_authenticity_token
,所有 api 相关 controller 继承这个类
浅拷贝
这就是个观察者模式撒,ruby 标准库不是提供了 observable 模块么。你的 emit_signal 接口对应的就是库里的 notify_observers 方法,再在订阅者里调用 add_observer 并实现 update 方法就完事了撒
tally 确实挺强大,少些好多代码。
我倒是挺喜欢 Numbered Parameters,以前就在想怎么把[1, 2].map { |ele| ele + 1 }
写短一点
Heval.class_eval { undef :f }
看 api 文档:default_scope(scope = nil, &block)
单纯的赋值符不是方法
试试 force_encoding('utf-8')
你想看对应的 C 实现,也要先找对文档嘛。String===String 实际调用的是 Module 中的===,不是 Object 的===
没有什么奇怪的,仔细看 sql。
你第一次执行的时候,存入的 receive_permissions 是序列化的数组,而第二次查询时,receive_permissions: ["country", "high_end"]
,sql 实际是个 in 语句:"emails"."receive_permissions" IN ('country', 'high_end')
,自然就找不到上一次存入的记录。接下来就会执行 create,然而 code 和 title 的 validation 没有通过,自然就报错了
你不如直接用 if false
eager_load 本来就是为了取代你第一行里的 left_joins 的。你这种写法,相当于 join 了两次,有点看不懂。 eager_load 自身的 select 语句会拼接到你指定的 select 语句后,所以会查出所有的字段
不会有 n+1,每个 user 已经加载了 books,user.books 不会执行 sql
User.eager_load(:books).ransack({:books_id_in=>params[:book_ids]}).map { |u| {username: u.name, book_names: u.books.map(&:name).join(',')} }
试试嘞。 不过这种数据拼装我一般不会在 controller 中处理
有啥问题,你把中间表看做有业务意义的表就行了
一楼给出了正确答案。我公司的项目就是这么干的
其实你在顶级作用域中定义的方法,不能算是 main 对象的单例方法,在 main 中执行self.singleton_methods
,结果其实不包含自定义的方法。这个方法其实成为了 Object 类的私有方法,这是 ruby 中实现全局函数的一种形式 (只能用省略 self 的形式去调用,调用的时候看起来像是函数)。
细想了一下,在 Class 类及其祖先中定义的实例方法均能实现全局静态函数的效果,当时是想得简单了。
在 Module 类中定义的实例方法会成为所有类以及模块的类方法,不知道是不是你要的效果
class Module
def foo
p 'spike'
end
end
BasicObject.foo # 'spike'
如果你想给 Kernel 打补丁并输出一些调试信息,类似于module Kernel; p @@spike;end
,要是 Kernel 没有 p 这样的单例方法,你该咋整嘞。怕是只有 extend self 咯
好奇你是怎么单独拿到 token 的。如果你从其他表单中提取 token,就会有问题
请贴代码。
不忍细看你的代码。 没用递归,逐层循环的方式如下,没有测试,可能有错
def get_all_subs
ids = [id]
ids.each do |id|
sub_ids = id.to_employee.all_sub_ids
ids.push(*sub_ids) if sub_ids.present?
end
return ids
end
对哦,搞错 slice! 的副作用了。那就用两次 slice!
a.tap{|arr| arr.slice!((n + m)..-1)}.tap{|arr| arr.slice!(0, n)}.push(*b[n,m])
其实直接用 keep_if 或者 delete! 看起来更简单
a.keep_if.with_index {|_, idx| idx >= n && idx < (n + m)}.push(*b[n,m])
p '0'
require 'active_support/concern'
p '1'
module C
p '2'
extend ActiveSupport::Concern
p '3'
included do
p '100'
end
p '4'
end
p '5'
module B
p '6'
extend ActiveSupport::Concern
p '7'
include C
p '8'
included do
p '101'
end
p '9'
end
p '10'
class A
p '11'
include B
p '102'
def hello
p '200'
end
p '103'
end
p '104'
A.new.hello
p '1000'
意外的调了一次。。
Array 的 + 方法返回的是新对象,对象 id 当然会变。
你写的解决方法是 OK 的,我不明白为什么处理a[n, m] + b[n, m]
会麻烦:
a.slice!(n,m)
a.push(*b[n,m])
支持,赶紧注册当元老!
楼主的表述堪忧,想问的问题应该是:既然 String.instance_methods 结果等于'abc'.methods,为什么 String.methods 结果不等于"abc".methods。
String.instance_methods 返回的是类的实例方法,String.methods 返回的是 String 作为一个对象时拥有的方法,由于 String 是 Class 类的实例,所以返回结果至少包含 Class 类的实例方法。为啥说‘至少包含’而不是‘等于’呢,因为结果实际还有 String 的单例方法。