Rails 多次seed

17 views
Skip to first unread message

Lei Guo

unread,
Aug 18, 2011, 3:20:04 AM8/18/11
to rail...@googlegroups.com
我们知道应该把数据初始化的任务放到seed里面去做,可是在开发的过程中,数据库不是一下子建起来,seed也不是一次能够完成的,这样在执行新加入的seed代码的时候,前面的又会执行一遍,造成之前一些测试数据的不一致

比较笨的做法是每次加入新的seed之前把前面的注释掉,这样部署/协作时会很不方便,大家有没有更好的办法?

--
Guo Lei

Andy

unread,
Aug 18, 2011, 3:47:25 AM8/18/11
to Rails Wednesday
既然是从新部署或者协作时候的全新seed数据,能不能在seeds.rb最开始的地方把已知的数据清空(比方:User.delete_all),这
样就不用每次都要comment一些代码。

On Aug 18, 3:20 pm, Lei Guo <guol...@gmail.com> wrote:
> 我们知道应该把数据初始化的任务放到seed里面去做,可是在开发的过程中,数据库不是一下子建起来,seed也不是一次能够完成的,这样在执行新加入的see d代码的时候,前面的又会执行一遍,造成之前一些测试数据的不一致

Lei Guo

unread,
Aug 18, 2011, 5:30:35 AM8/18/11
to rail...@googlegroups.com
对,在新增数据之前肯定是要先清空的

现在的问题是,清空后再创建id就不一样了,这样系统里面的一些测试数据就不准确了(通过id关联的数据)



2011/8/18 Andy <wang...@gmail.com>



--
Guo Lei

Andy

unread,
Aug 18, 2011, 5:37:26 AM8/18/11
to Rails Wednesday
嗯,那你就每次需要增加数据的时候创建自己的Rake Task来做,这样可以保证数据的一致性!

On Aug 18, 5:30 pm, Lei Guo <guol...@gmail.com> wrote:
> 对,在新增数据之前肯定是要先清空的
>
> 现在的问题是,清空后再创建id就不一样了,这样系统里面的一些测试数据就不准确了(通过id关联的数据)
>

> 2011/8/18 Andy <wangya...@gmail.com>

zhang zhe

unread,
Aug 18, 2011, 6:51:13 AM8/18/11
to rail...@googlegroups.com
针对不同的类型的数据可以不同处理。
1. id 关联不敏感的数据: 完全可以在创建时将之前的纪录删掉, 甚至 delete_all.
2. 数据量不是很大而且数据敏感: 可以用 find_or_create_by 过滤掉可能出现的重复。
3. 数据量大而且数据敏感:
seed 分批建。在操作时可以将相关数据分组(如下例中的 user 和 role),根据分组中的关键数据判断是否执行 seed 操作, 过滤方式需根据实际情况相应调整。
顺便分享一个我们在 seed 中使用的方法(begin_seeding):

# for shortening output code
def begin_seeding(items, field_empty, &block)
description = "seeding #{items}"
if field_empty
puts description.center(70, '=')
yield
else
puts "skip #{description}".center(70, '=')
end
end

例子:
def user_empty?
User.find_by_name("tom").nil?
end

begin_seeding "users and roles", user_empty? do
role = Role.create(:name => "strong animal")
['tom', 'jerry'].each do |name|
role.users << User.create(:name => name)
end
end

优点:
可多次执行,不会影响之前数据;
合理分组后可增加代码可读性。

缺点:
需要分组合理;
以后最好不要修改已分好组的数据块。

Lei Guo

unread,
Aug 18, 2011, 7:01:56 AM8/18/11
to rail...@googlegroups.com
我在想能不能做成migration那种机制的,可以多次创建,运行rake时只运行没有执行过的,这样应该能比较优雅地解决问题

等有闲了弄个gem试试

2011/8/18 zhang zhe <gary....@gmail.com>



--
Guo Lei

zhang zhe

unread,
Aug 18, 2011, 7:10:45 AM8/18/11
to rail...@googlegroups.com
seed migration ^_^, 是个好主意。
不过也需要分成独立文件,并且用时间什么的做标记并存起来吧。

Fred Liang

unread,
Aug 18, 2011, 9:55:51 AM8/18/11
to rail...@googlegroups.com
之前我试过把Factory当作seed来创建数据,这样做的好处是每次重建可以很随意的删掉旧数据,不会出现新数据的id不同而影响关联记录

---------
Best regards
梁忠强


2011/8/18 zhang zhe <gary....@gmail.com>

huang zhimin

unread,
Aug 19, 2011, 5:44:53 AM8/19/11
to rail...@googlegroups.com

Lei Guo

unread,
Aug 19, 2011, 10:37:24 AM8/19/11
to rail...@googlegroups.com
这个好,正是我想要的

2011/8/19 huang zhimin <flye...@gmail.com>



--
Guo Lei

wxianfeng

unread,
Aug 24, 2011, 11:35:18 PM8/24/11
to Rails Wednesday
个人不喜欢用seed,数据更新我都是写个rb脚本,然后用 script/runner 调用


PS:
gmail 中如何看到groups里之前所有的discussions啊,没发现,只好打开主页,但是回复成这个效果了,怎么前面的list都丢了,
郁闷!

On Aug 18, 3:20 pm, Lei Guo <guol...@gmail.com> wrote:
> 我们知道应该把数据初始化的任务放到seed里面去做,可是在开发的过程中,数据库不是一下子建起来,seed也不是一次能够完成的,这样在执行新加入的see d代码的时候,前面的又会执行一遍,造成之前一些测试数据的不一致

Reply all
Reply to author
Forward
0 new messages