我想检查一个ActiveRecord实例是否在数据库方面被更改.就像是:
p1 = Product.first
p1.name #=> "some name"
p2 = Product.first
p2.name = "other name"
p2.save #=> true
p1.database_changed? #=> true
Run Code Online (Sandbox Code Playgroud)
我目前正在将记录的属性与持久化属性进行比较:
class Product < ActiveRecord::Base
def database_changed?
Product.find(id).attributes != attributes
end
end
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我想知道是否有内置的方法来查找数据库更改?
我在bash提示符中使用以下行安装了pry和相关的gem:
gem install pry-plus --no-ri --no-rdoc
Run Code Online (Sandbox Code Playgroud)
该命令报告了成功的gem安装.
我发现的所有说明都说安装pry之后我可以通过输入prybash命令来获得pry提示符.但是,实际结果是bash: pry: command not found
which pry报告no pry in (...)省略号为$ PATH的位置.相比之下,which rake报告/local/tbh/rbenv/shims/rake和which gem报告/local/tbh/rbenv/shims/gem
为什么pry的命令不是由gem install创建的?我怎样才能让它按设计工作?
(我在Scientific Linux下使用Ruby 1.9.3和rbenv(不是RVM)作为虚拟环境.)
我有这样一个数组: [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6]
从数组6到0返回数组中每个项的最简单方法是什么,结果数组如下所示: [1,2,3,4,5,6,7]
数组中的这个位置可以是动态的,例如传入4和9应该返回 [11,12,1,2,3,4]
我想知道是否有一种方法可以在Rails api中实现这一点.
提前致谢
编辑让我们假设没有负数,所以做array[2..-2]不行.
Array#splice几乎适用于此,但如果第二个位置小于第一个位置,则返回nil.
例如,要返回我可以写的第10,000个素数:
require 'prime'
Prime.first(10000).last #=> 104729
Run Code Online (Sandbox Code Playgroud)
但是创建一个巨大的中间数组,只是为了检索它的最后一个元素感觉有点麻烦.
鉴于Ruby是如此优雅的语言,我会期待如下:
Prime.at(9999) #=> 104729
Run Code Online (Sandbox Code Playgroud)
但没有Enumerable#at.
以上解决方法是否有意或是否有更直接的方法来获取第n个元素Enumerable?
(问题已在Ruby论坛发布,但没有引起任何答案).
这是我的代码:
class MC
def initialize
@x = 5
@@y = 6
end
def f
puts @x
puts @@y
end
end
m = MC.new
m.f
Run Code Online (Sandbox Code Playgroud)
m.f 产生预期的输出而没有错误:
5
6
Run Code Online (Sandbox Code Playgroud)
但是这个:
def m.g
puts @x
puts @@y
end
m.g
Run Code Online (Sandbox Code Playgroud)
生产:
5
warning: class variable access from toplevel
NameError: uninitialized class variable @@y in Object
Run Code Online (Sandbox Code Playgroud)
为什么我能访问@@y从f,但不从g?
在警告和错误信息的提及中toplevel,Object对我来说是令人费解的.
@x印刷为5,所以它的环境是MC.这排除的可能性,@x并@@y在定义m.g指的是顶层环境(Object …
我是Ruby的新手,并尝试理解这种语法:
create_table :posts do |t|
t.string :title
t.string :content
t.string :likes
t.string :comments
t.timestamps null: false
end
Run Code Online (Sandbox Code Playgroud)
我完全理解什么这段代码是干什么的,但我不明白如何它的工作原理.更具体地说,我理解这create_table是一个方法,并且:posts是一个参数,但我不理解其余的代码.
在Ruby中,常量查找受嵌套影响,方法保留其嵌套.
例如,如果我有这些模块:
module A
X = 1
end
module B
X = 2
end
module Foo
end
Run Code Online (Sandbox Code Playgroud)
我可以定义Foo.a一个嵌套的方法[A, Foo]:
module Foo
module ::A
Module.nesting #=> [A, Foo]
def Foo.a
X
end
end
end
Foo.a #=> 1
Run Code Online (Sandbox Code Playgroud)
以及Foo.b嵌套的方法[Foo, B]:
module B
module ::Foo
Module.nesting #=> [Foo, B]
def Foo.b
X
end
end
end
Foo.b #=> 2
Run Code Online (Sandbox Code Playgroud)
如果我定义Foo::X:差异变得明显:
Foo::X = 3
Foo.a #=> 1 <- still resolves to A::X
Foo.b #=> 3 …Run Code Online (Sandbox Code Playgroud) 在Ruby,Javascript和Java(其他我没试过)中,有西里尔字符Я̆Я̄Я̈长度2.当我尝试用这些字符检查字符串的长度时,我的输出值很差.
"??".mb_chars.length
#=> 2 #should be 1 (ruby on rails)
"??".length
#=> 2 #should be 1 (ruby, javascript)
"?".length
#=> 1 #correct (ruby, javascript)
Run Code Online (Sandbox Code Playgroud)
请注意,字符串以UTF-8编码,每个字符串都表现为单个字符.
我的问题是为什么会有这样的行为,如何在这些字符内正确获取字符串的长度?
我想向 API 发送 POST 请求。这是我的代码:
conn = Faraday.new(url: BASE) do |faraday|
faraday.response :logger
faraday.request :url_encoded
faraday.headers['Content-Type'] = 'application/json'
faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
conn = Faraday.new(url: BASE) do |faraday|
faraday.response :logger
faraday.request :url_encoded
faraday.headers['Content-Type'] = 'application/json'
faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
conn.post("/api/test", form_data.to_json)
Run Code Online (Sandbox Code Playgroud)
但它也不起作用。
在关联中,我们通常这样做a :b(belongs_to :something)。当我们使用符号键创建哈希时,通常会这样做a: b。话虽如此,我的问题是两种语法之间的区别是什么。还有什么逻辑可以记住何时使用哪种约定?