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 的单例方法。
你需要仔细再看看@mizuhashi举的例子,他的例子里 params[:id] 是 credit_card 的 id,不是 user 或 accout 的 id。他所说的情况是 user 没有跟内层资源直接关联,而是跟外层资源关联。
你直接将@c写在类里 (元类也是类),而不是写在方法里,这种变量是类实例变量(class instance variable)
,而不是实例变量。它跟实例变量的用法并不一样。所以这个问题并不是实例变量
的坑。
重写 csrf_meta_tags 方法可以改 csrf-param
def csrf_meta_tags
if protect_against_forgery?
[
tag("meta", name: "csrf-param", content: request_forgery_protection_token),
tag("meta", name: "csrf-token", content: form_authenticity_token)
].join("\n").html_safe
end
end
?.等价于'.',?\n等价于'\n'。说白了就是单个字符,不过项目中不建议使用
没有区别,别名关系
Enumerator.instance_method(:with_object) == Enumerator.instance_method(:each_with_object)
返回 true
额。你把多个不同意义的参数封在了一个数组里,这个例子才会这么麻烦。如果是foo(arr: nil, size: nil, default: nil)
就清晰多了,内部的判断也就变成了if arr
。如果内部逻辑麻烦的话,我一般会拆成几个方法,再由 foo 提供统一接口 (如果需要有统一接口的话)