- 浏览: 243238 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (173)
- ruby (38)
- rails (42)
- javascript (7)
- jquery (1)
- linux (15)
- design patterns (1)
- project management (6)
- IT (7)
- life (19)
- data structures and algorithm analysis (2)
- css (1)
- prototype (1)
- mysql (4)
- html (1)
- git (3)
- novels (1)
- c (1)
- Latex (13)
- erlang (1)
- 求职 (1)
- API (0)
- Shell (4)
- Rabbit MQ (1)
- 计算机基础 (1)
- svn (2)
- 疑问 (1)
最新评论
-
zhangyou1010:
回去倒立去,哈哈。
作为一个程序员,身体很重要! -
Hooopo:
Ruby MetaProgramming is all abo ...
Metaprogramming Ruby -
orcl_zhang:
yiqi1943 写道LZ现在上学还是工作呢工作好多年了。不过 ...
2011年 -
yiqi1943:
LZ现在上学还是工作呢
2011年 -
tjcjc:
query cache
就是一个简单的hash
key就是sq ...
Rails sql延迟加载和自带缓存
这是我在实际中遇到的问题.
废话不多说,直接上代码。
在out里
在out_item里
在执行完out中update_attributes后,out_items.each(&:change_placement),而这时debug代码到change_placement方法中,发现self.out_placements这里是empty array。但是此时,打开console,通过命令,你发现,out_placements不是空的,而且通过数据库也可以看到已经成功的将out_placement更新并且和out_item关联。out_placements明明有,为什么在这里却是empty array呢?
是哪里出问题?
经过一番折腾,猜想是不是在has_manyut_placements中,默认的out_placements使用了缓存?这里的out_placements用的缓存,而没有从数据库里重新查询。如果是这样,应该将缓存更新即可。通过分析代码。发现可能是这里出问题里。
但是如果我将out_item里的代码改成(注释部分即改变部分)out_placements.create(out_placement_attribute),发现debug到self.out_placements后,out_placements就不是空数组,运行正常了。
成功了。原来使用out_placements.create(out_placement_attribute)这样的操作,不但更新了数据库,而且更新了out_placements缓存,而直接的用op = out_placements.build(out_placement_attribute);op.save,虽然将out_placement保存到了数据库,但是此时再调用out_placements得到的还是之前缓存。
# 看你这种写法,可能是从前端用params批量传值过来,进行批量提交的,所以key可能是字符串,采用id.to_s比较
我很是不同意这点。就算key是字符串怎样?本来他也就是字符串。
你可以在console下试下,A.find('1')。
oi = out_items.detect {|o| o.id.to_s == key }
oi.update_attributes value
至于这段代码,我觉得也没有必要这样写。
这点你误会了,使用find时,当然不管是字符串还是数字都可以。
我注明这点只是因为
这句可能看起来有点奇怪,所以对为什么要把o.id变成字符串来再比较,做的解释。
至于那样改写的原因,只是要利用out_items这个association找出来的对象,而不是OutItem.find,这也是我和你代码的不同,原因我在上面一个帖子里都写明了。
再说一句,console中看到的东西不见得是真相哦。我刚开始学习Rails被它欺骗了好一阵子。所以在console中测试不是最好的办法。
不信你可以分别试试下面两句,其中第一句是不会查询数据库的,但第二句会(其实真实运行环境中都是不会查数据库的,这是console的一点小把戏):
你可以在console中敲一句,然后在日志中看看生成了SQL语句没有。
最后,如果不明白,你可以找一下irb和inspect方法的文章。
# 看你这种写法,可能是从前端用params批量传值过来,进行批量提交的,所以key可能是字符串,采用id.to_s比较
我很是不同意这点。就算key是字符串怎样?本来他也就是字符串。
你可以在console下试下,A.find('1')。
oi = out_items.detect {|o| o.id.to_s == key }
oi.update_attributes value
至于这段代码,我觉得也没有必要这样写。
我是猜测你用的params批量传值,也不知道对不对……有空写写文字吧。个人觉得代码从来不是程序员的问题。
代码也就是实现这个功能。我在前面没有表述,让大家看着受累了。
多写写文字确实是不错,代码只是实现手段。
这点偶吸取教训,多写些文字。
废话不多说,直接上代码。
在out里
has_many :out_items def pick(os) update_attributes(os) out_items.each(&:change_placement) end def out_item_attributes=(out_item_attributes) out_item_attributes.each do |key,value| OutItem.find_by_id(key).update_attributes(value) end end
在out_item里
has_many :out_placements def new_out_placement_attributes=(out_placement_attributes) out_placement_attributes.each do |out_placement_attribute| #out_placements.create(out_placement_attribute) op = out_placements.build(out_placement_attribute) op.save end end def change_placement self.out_placements.each(&:change_placement) end
在执行完out中update_attributes后,out_items.each(&:change_placement),而这时debug代码到change_placement方法中,发现self.out_placements这里是empty array。但是此时,打开console,通过命令,你发现,out_placements不是空的,而且通过数据库也可以看到已经成功的将out_placement更新并且和out_item关联。out_placements明明有,为什么在这里却是empty array呢?
是哪里出问题?
经过一番折腾,猜想是不是在has_manyut_placements中,默认的out_placements使用了缓存?这里的out_placements用的缓存,而没有从数据库里重新查询。如果是这样,应该将缓存更新即可。通过分析代码。发现可能是这里出问题里。
op = out_placements.build(out_placement_attribute) op.save
但是如果我将out_item里的代码改成(注释部分即改变部分)out_placements.create(out_placement_attribute),发现debug到self.out_placements后,out_placements就不是空数组,运行正常了。
成功了。原来使用out_placements.create(out_placement_attribute)这样的操作,不但更新了数据库,而且更新了out_placements缓存,而直接的用op = out_placements.build(out_placement_attribute);op.save,虽然将out_placement保存到了数据库,但是此时再调用out_placements得到的还是之前缓存。
评论
6 楼
orcl_zhang
2010-03-12
发现其实在rails里面,在表间关联中很多这样的例子。
如果这样写
则返回的ms是不同的。
self.my_steps.build(:name => name) self.my_steps.each do |mstep| mstep.save(false) end ms = self.my_steps
如果这样写
self.my_steps.create(:name => name) ms = self.my_steps
则返回的ms是不同的。
5 楼
orcl_zhang
2010-02-23
out.out_items这个,第一句执行应该是要查询数据库的吧?第二次就不需要了。应该是rails的缓存。应该是类似
这样的方式实现的。
这个还是真不知道。。
out.out_items; nil 这句确实没有查询。暂时还不知道原因。
有空了看下irb和inspect方法的文章。
挺晚了,睡觉。明天继续搞。
def current_user @current_user ||= User.find(session[:user_id]) end
这样的方式实现的。
引用
console中看到的东西不见得是真相哦。
这个还是真不知道。。
out.out_items; nil 这句确实没有查询。暂时还不知道原因。
有空了看下irb和inspect方法的文章。
挺晚了,睡觉。明天继续搞。
4 楼
darkbaby123
2010-02-22
orcl_zhang 写道
引用
# 看你这种写法,可能是从前端用params批量传值过来,进行批量提交的,所以key可能是字符串,采用id.to_s比较
我很是不同意这点。就算key是字符串怎样?本来他也就是字符串。
你可以在console下试下,A.find('1')。
引用
oi = out_items.detect {|o| o.id.to_s == key }
oi.update_attributes value
至于这段代码,我觉得也没有必要这样写。
这点你误会了,使用find时,当然不管是字符串还是数字都可以。
我注明这点只是因为
o.id.to_s == key
这句可能看起来有点奇怪,所以对为什么要把o.id变成字符串来再比较,做的解释。
至于那样改写的原因,只是要利用out_items这个association找出来的对象,而不是OutItem.find,这也是我和你代码的不同,原因我在上面一个帖子里都写明了。
再说一句,console中看到的东西不见得是真相哦。我刚开始学习Rails被它欺骗了好一阵子。所以在console中测试不是最好的办法。
不信你可以分别试试下面两句,其中第一句是不会查询数据库的,但第二句会(其实真实运行环境中都是不会查数据库的,这是console的一点小把戏):
out.out_items; nil out.out_items
你可以在console中敲一句,然后在日志中看看生成了SQL语句没有。
最后,如果不明白,你可以找一下irb和inspect方法的文章。
3 楼
darkbaby123
2010-02-22
<p>刚才仿造你的代码测试了一下,结果和我原先想的有些出入。</p>
<p>我的测试结果是,不管是create还是build,最后out_placements中都是空数组。</p>
<p>我下面会说明我的测试方法,并说明原因。</p>
<p>现在先说说LZ的结论,其实对Rails的association而言,不管是使用create还是build都会相应的改变association中的缓存。要是这点都没想到DHH也可以退休了。</p>
<p>LZ的错误还是在Out#out_item_attributes方法上</p>
<pre name="code" class="ruby">def out_item_attributes=(out_item_attributes)
out_item_attributes.each do |key,value|
# 这里不该用OutItem直接查。
# 因为对这个OutItem查出来的对象(暂称oi)调用update_attributes的话,
# 会间接调用oi的new_out_placement_attributes方法,虽然生成了OutPlacements,但更新的是oi.out_placements的缓存。
# 而oi会在这个each循环结束后销毁,自然什么都记不住。实际上这个oi和最外层Out对象的out_items是没有任何关系的。
OutItem.find_by_id(key).update_attributes(value)
end
end</pre>
<p>所以对out对象调用如下方法:</p>
<pre name="code" class="ruby">out.pick ...</pre>
<p> 时,out.out_items的缓存根本就没动过,实际上在update_attributes的整个阶段,它都应该没有查询过数据库,缓存自然无从谈起,直到下面一句each。</p>
<p>这时的问题才刚出现,刚才pick方法的第一句update_attributes已经将out_placements写进数据库了(不管是create还是build),这时执行第二句out_items.each时,才进行数据库查询(association只在“需要”的时候才会执行数据库查询,这就不多说了),那查询出来的结果应该是正确的,绝不可能是空数组。</p>
<p><span style="color: #0000ff;">而LZ碰到的是空数组,我想是因为在调用out.pick之前,在其他地方遍历过out.out_items,从而提前查出了数据,放进了out_items的缓存,之后在update_attributes时,又没有更新缓存,才出现的问题。所以不管create还是build,应该都会报空数组的错误的。</span></p>
<p>要改过来很简单,就照我上一个帖子的代码改。</p>
<p> </p>
<p>下面附上本人的测试代码,和一些逻辑。我根据方法命名,猜测LZ做的这个功能是利用update_attributes来做批量数据提交。所以测试逻辑都是围绕这个来写的,如果错了,还请LZ指正。</p>
<pre name="code" class="ruby"># RAILS_ROOT/test/unit/out_test.rb
require 'test_helper'
class OutTest < ActiveSupport::TestCase
fixturesuts,ut_items
def setup
# 初始数据库环境如下:
# outs表中有一条记录
# out_items表中也有一条记录,从属于outs表中的那一条记录
# out_placements表没有记录
@out = outs(:o1)
@out_attrs = {
ut_item_attrs => {
# 更新一个id为1的OutItem对象
"1" => {
:title => "out item 1",
# 为out_placements写入两条记录
:new_out_placement_attributes => [
{:title => "placement 1"},
{:title => "placement 2"}
]
}
}
}
end
# 测试1,调用@out.pick,再看之后的数据库记录是不是增加了
test "1" do
# 直接执行pick,方法调用顺序如下:
# Out#pick -> Out#update_attributes -> Out#out_item_attr= -> OutItem#Update_attributes -> OutItem#new_out_placement_attrs=
@out.pick @out_attrs
oi1 = @out.out_items[0]
# 可以看到,写入了两条记录
assert_equal oi1.out_placements.size, 2
end
# 测试2,和测试1唯一不同的就是在调用pick之前,先把@out.out_items的数据读出来,生成缓存了
test "2" do
# 这段代码没其他目的,就是提前把out_placements的数据读到内存中来
# 此时out_placements是空数组
@out.out_items.each { |oi| oi.out_placements.each {|op|} }
@out.pick @out_attrs
oi1 = @out.out_items[0]
# 这里因为缓存原因,还是0条记录,其实数据已经写进去了
assert_equal oi1.out_placements.size, 0
# reload之后就显示真实的数字了
assert_equal oi1.reload.out_placements.size, 2
end
end</pre>
<p>然后是fixtures,很简单,就不解释了</p>
<pre name="code" class="yaml"># RAILS_ROOT/test/fixtures/outs.yml
# outs表,title属性是随意加的,要不要无所谓
o1:
id: 1
title: out
# RAILS_ROOT/test/fixtures/out_items.yml
# out_items表
oi1:
id: 1
title: out item 1
out_id: 1</pre>
<p> 运行</p>
<pre name="code" class="console">ruby -I test ./test/unit/out_test.rb</pre>
<p>我的测试结果是,不管是create还是build,最后out_placements中都是空数组。</p>
<p>我下面会说明我的测试方法,并说明原因。</p>
<p>现在先说说LZ的结论,其实对Rails的association而言,不管是使用create还是build都会相应的改变association中的缓存。要是这点都没想到DHH也可以退休了。</p>
<p>LZ的错误还是在Out#out_item_attributes方法上</p>
<pre name="code" class="ruby">def out_item_attributes=(out_item_attributes)
out_item_attributes.each do |key,value|
# 这里不该用OutItem直接查。
# 因为对这个OutItem查出来的对象(暂称oi)调用update_attributes的话,
# 会间接调用oi的new_out_placement_attributes方法,虽然生成了OutPlacements,但更新的是oi.out_placements的缓存。
# 而oi会在这个each循环结束后销毁,自然什么都记不住。实际上这个oi和最外层Out对象的out_items是没有任何关系的。
OutItem.find_by_id(key).update_attributes(value)
end
end</pre>
<p>所以对out对象调用如下方法:</p>
<pre name="code" class="ruby">out.pick ...</pre>
<p> 时,out.out_items的缓存根本就没动过,实际上在update_attributes的整个阶段,它都应该没有查询过数据库,缓存自然无从谈起,直到下面一句each。</p>
<p>这时的问题才刚出现,刚才pick方法的第一句update_attributes已经将out_placements写进数据库了(不管是create还是build),这时执行第二句out_items.each时,才进行数据库查询(association只在“需要”的时候才会执行数据库查询,这就不多说了),那查询出来的结果应该是正确的,绝不可能是空数组。</p>
<p><span style="color: #0000ff;">而LZ碰到的是空数组,我想是因为在调用out.pick之前,在其他地方遍历过out.out_items,从而提前查出了数据,放进了out_items的缓存,之后在update_attributes时,又没有更新缓存,才出现的问题。所以不管create还是build,应该都会报空数组的错误的。</span></p>
<p>要改过来很简单,就照我上一个帖子的代码改。</p>
<p> </p>
<p>下面附上本人的测试代码,和一些逻辑。我根据方法命名,猜测LZ做的这个功能是利用update_attributes来做批量数据提交。所以测试逻辑都是围绕这个来写的,如果错了,还请LZ指正。</p>
<pre name="code" class="ruby"># RAILS_ROOT/test/unit/out_test.rb
require 'test_helper'
class OutTest < ActiveSupport::TestCase
fixturesuts,ut_items
def setup
# 初始数据库环境如下:
# outs表中有一条记录
# out_items表中也有一条记录,从属于outs表中的那一条记录
# out_placements表没有记录
@out = outs(:o1)
@out_attrs = {
ut_item_attrs => {
# 更新一个id为1的OutItem对象
"1" => {
:title => "out item 1",
# 为out_placements写入两条记录
:new_out_placement_attributes => [
{:title => "placement 1"},
{:title => "placement 2"}
]
}
}
}
end
# 测试1,调用@out.pick,再看之后的数据库记录是不是增加了
test "1" do
# 直接执行pick,方法调用顺序如下:
# Out#pick -> Out#update_attributes -> Out#out_item_attr= -> OutItem#Update_attributes -> OutItem#new_out_placement_attrs=
@out.pick @out_attrs
oi1 = @out.out_items[0]
# 可以看到,写入了两条记录
assert_equal oi1.out_placements.size, 2
end
# 测试2,和测试1唯一不同的就是在调用pick之前,先把@out.out_items的数据读出来,生成缓存了
test "2" do
# 这段代码没其他目的,就是提前把out_placements的数据读到内存中来
# 此时out_placements是空数组
@out.out_items.each { |oi| oi.out_placements.each {|op|} }
@out.pick @out_attrs
oi1 = @out.out_items[0]
# 这里因为缓存原因,还是0条记录,其实数据已经写进去了
assert_equal oi1.out_placements.size, 0
# reload之后就显示真实的数字了
assert_equal oi1.reload.out_placements.size, 2
end
end</pre>
<p>然后是fixtures,很简单,就不解释了</p>
<pre name="code" class="yaml"># RAILS_ROOT/test/fixtures/outs.yml
# outs表,title属性是随意加的,要不要无所谓
o1:
id: 1
title: out
# RAILS_ROOT/test/fixtures/out_items.yml
# out_items表
oi1:
id: 1
title: out item 1
out_id: 1</pre>
<p> 运行</p>
<pre name="code" class="console">ruby -I test ./test/unit/out_test.rb</pre>
2 楼
orcl_zhang
2010-02-22
引用
# 看你这种写法,可能是从前端用params批量传值过来,进行批量提交的,所以key可能是字符串,采用id.to_s比较
我很是不同意这点。就算key是字符串怎样?本来他也就是字符串。
你可以在console下试下,A.find('1')。
引用
oi = out_items.detect {|o| o.id.to_s == key }
oi.update_attributes value
至于这段代码,我觉得也没有必要这样写。
引用
我是猜测你用的params批量传值,也不知道对不对……有空写写文字吧。个人觉得代码从来不是程序员的问题。
代码也就是实现这个功能。我在前面没有表述,让大家看着受累了。
多写写文字确实是不错,代码只是实现手段。
这点偶吸取教训,多写些文字。
1 楼
darkbaby123
2010-02-22
我觉得,这确实是association的缓存原因,但你的写法也有点问题。
你把out文件的out_item_attributes=方法如下改一下试试:
下面的代码还是用build,应该没问题的。
暂时想到这些,还没测试过,LZ自己试试吧
PS: 你这样直接上代码,而且只是一部分代码,很容易让人迷惑的。我是猜测你用的params批量传值,也不知道对不对……有空写写文字吧。个人觉得代码从来不是程序员的问题。
你把out文件的out_item_attributes=方法如下改一下试试:
# RAILS_ROOT/app/models/out.rb def out_item_attributes=(out_item_attributes) out_item_attributes.each do |key,value| # OutItem.find_by_id(key).update_attributes(value) # 在association查出来的array中去找,而不是直接find_by_id # 看你这种写法,可能是从前端用params批量传值过来,进行批量提交的,所以key可能是字符串,采用id.to_s比较 oi = out_items.detect {|o| o.id.to_s == key } oi.update_attributes value end end
下面的代码还是用build,应该没问题的。
暂时想到这些,还没测试过,LZ自己试试吧
PS: 你这样直接上代码,而且只是一部分代码,很容易让人迷惑的。我是猜测你用的params批量传值,也不知道对不对……有空写写文字吧。个人觉得代码从来不是程序员的问题。
发表评论
-
calendar
2012-02-24 11:04 877http://fullcalendar.vinsol.com/ ... -
ActiveRecord::Dirty
2011-11-21 10:29 788引用Track unsaved attribute chang ... -
TinyTDS
2011-09-20 09:29 859tiny_tds https://github.com/ra ... -
pandoc-ruby
2011-09-11 11:50 1208https://github.com/alphabetum/p ... -
Rails: Calling render() outside your Controllers
2011-04-28 17:15 834From:http://blog.choonkeat.com/ ... -
为什么这样才能装上
2011-02-20 10:39 1046引用u2@u2-laptop:~$ sudo gem inst ... -
Rails的transaction
2011-01-07 18:36 3058今天同事问我关于rails transaction,如 ... -
Rails sql延迟加载和自带缓存
2010-12-30 01:11 1612color_lot_manuallies = color_lo ... -
关于rhtml
2010-12-23 00:26 871在视图里有这样一段代码 sorted_op_items = o ... -
will_paginate ajax
2010-11-26 13:21 912两种方法 一, @@pagination_options ... -
save > save!(转)
2010-11-19 19:57 756Thoughtbot folks have a great a ... -
USE INDEX with Active Record finders(转)
2010-11-18 22:07 892可以通过强制指定index的方法优化find MySQL do ... -
html转义
2010-11-17 23:03 955$("#contacts").html(& ... -
Rails HTTP Status Code to Symbol Mapping
2010-11-17 22:40 1623http状态码http://zh.wikipedia.org/ ... -
Scaling Rails很不错的视频
2010-09-29 18:10 824自从railscasts开始讲解rails3后就很久没看了。 ... -
ActionController源码(待续)
2010-09-20 15:14 1027/usr/local/lib/ruby/gems/1.8/ge ... -
rails源码ActionSupport(待续)
2010-08-31 16:59 935一些奇淫技巧 class Object # An ... -
动态的增加auto_complete
2010-08-30 12:17 896http://www.iteye.com/problems/3 ... -
rails 记录
2010-08-26 15:27 751代码里有这样一句 self.purchase_invoices ... -
用Array来实现OrderedHash
2010-08-18 14:29 916偶然发现电脑的角落里有这样的一段代码.功能是用Array实现的 ...
相关推荐
持续移动且不破坏事物 :factory: :building_construction: :construction: :construction_worker: 正在建设中-请稍后再回来!
介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...
允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...
graphql-rails-generators 一些生成器可以轻松将Rails模型与集成。 我之所以创建它,是因为我浪费了太多的按键来手动复制模型架构以创建graphql类型。 该项目包含用于查看ActiveRecord模型架构的生成器,并为您...
Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails 应用程序要快。 Rails::API 可以用来创建只提供API服务(API-Only)的 Rails ...
:dog_face: MiAudota :cat_face: 该应用程序显示可从用户最近的庇护所获取的动物,并允许将其应用到收养过程中,从而完成一份调查表,... Ruby on Rails API; PostgreSQL; Heroku。执照版权所有:copyright:2019, 。
gem "mongoid_rails_migrations" 如何使用 创建迁移 $ rails generate mongoid:migration 运行迁移: $ rails db:migrate $ rails db:migrate:down VERSION= $ rails db:migrate:up VERSION= $ rails db:rollback...
Rails的服务器定时响应头 带来Ruby on Rails服务器端性能指标 :chart_increasing: 通过server_timing gem访问Chrome的开发者工具(以及其他支持浏览器)。 生产安全:trade_mark:。 指标是从 gem收集的。 不需要帐户...
Rails3 是 Ruby on Rails 框架的第三个主要版本,它在灵活性、性能和社区支持方面都有显著提升。Thinking Sphinx 是一个为 Rails 应用程序提供全文搜索功能的插件,它将数据库中的数据与 Sphinx 搜索引擎紧密结合,...
SEO 和 Ruby On Rails 由的SEO代理制作的示例应用程序,用于将Rails设置为SEO友好。教程您可以在找到教程,或在。安装 git clone git@github....
rails_best_practices ...默认情况下,rails_best_practices将解析vendor , spec , test和features目录中的代码。 排除目录 要排除目录,只需使用-e或--exclude调用: rails_best_practices -e "db/migrate
这是关于如何使用has_many :throght创建多对多关联的完整示例has_many :throght在此示例中,我使用staff模型和client模型,其中人员有很多客户,而客户有很多员工 操作说明 在下面的终端中输入 $ rails new many - ...
factory_bot_rails ...添加factory_bot_rails到您的Gemfile的测试和开发组都: group :development , :test do gem 'factory_bot_rails' end 您可能希望将测试套件配置为包括factory_bot方法。 见。 自动工厂
本书教您如何使用Ruby on Rails开发和部署真正的,具有工业实力的Web应用程序,Ruby on Rails是为诸如Twitter,Hulu,GitHub和Yellow Pages等顶级网站提供支持的开源Web框架。
而ActiveStorage是Rails 5.2及更高版本中引入的一个特性,用于处理文件上传和存储,包括用户头像。本示例将详细解释如何将ActiveStorage集成到使用Devise的Rails应用中,以便用户可以上传和管理他们的个人头像。 ...
has_many :api_keys, dependent: :destroy def generate_api_key api_key = self.api_keys.create!(key: SecureRandom.urlsafe_base64) api_key.key end def revoke_api_key api_keys.destroy_all end end...
《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...
Rails-Mini-Social-Network用Rails创建的迷你社交网络! 不再维护。 其他版本React版本Vue版本Golang版本快速链接屏幕截图用法Scree Rails-Mini-Social-Network一个由Rails创建的迷你社交网络! 不再维护。 另一个...
Ruby on Rails教程:первоеприложение 。 您可能要讲的内容: * Rails版本4.2.1 * Ruby版本2.2.2-p95(i686-linux) * RubyGems版本2.4.5 *机架版本1.6.4 * JavaScript运行时Node.js(V8)...