seed

Published on:

这可能是最详细的全栈营【seed】教程

job-listing

最开始对seed产生兴趣是因为这篇文章:

https://forum.qzy.camp/t/heroku-app/436

 puts "这个seeds文件可以自动建立一个admin账号,并且创建10个public jobs,以及10各hidden jobs"

 create_account = User.create([email: 'example@gmail.com', password:'123456', password_confirmation: '123456', is_admin: 'true'])
 puts "Admin account created."

 create_job = for i in 1..10 do
   Job.create!([title: "Job no.#{i}", description: "这是用seeds文件建立的第 #{i} 个公开的工作", wage_upper_bound: rand(50..99)*100, wage_lower_bound: rand(10..49)*100, is_hidden: "false"])
 end
 create_job = for i in 1..10 do
   Job.create!([title: "Job no.#{i}", description: "这是用seeds文件建立的第 #{i} 个隐藏的工作", wage_upper_bound: rand(50..99)*100, wage_lower_bound: rand(10..49)*100, is_hidden: "true"])
 end

 puts "10 Hidden jobs created."

这可能是第一次直观感受到xdite老师说的“编程可以解放重复劳动”,当时就觉得好牛牪犇啊!

这篇seed中需要注意的是:

1循环呀

for i in 1..10 do

end

这是一个循环语句,更常见的循环在我们的教程里应该是index.html中的

<% xxxx.each do |xxx| %>

<% end %>

当然还有其他的循环写法,就不多说啦。

2 生成随机数啦

语法是这样的:

rand(5..10)*10

括号内的是范围,是一个闭区间,生成整数,后面可以写数学表达式,加减乘除都是可以的,但对我们用处最大的还是*100,向上面那种写法,就是随机生成500、600、700、800、900、1000,会比较好看。

3屏幕显示咧

puts “xxx” 终端会显示出 双引号中的内容 ,开心吧,嘻嘻。

第一次基本就用这个啦,没做太多研究。

但在无意中发现irb里的东西都可以写到seed里,语法一模一样呀,直接搬过来!

单图上传

后来写了图片上传的功能,seed没有跟上,不知道怎么写,直到看到这篇:

https://forum.qzy.camp/t/seeds-rb-jdstore/600

 products =[{title:"Apple iPhone 6 64GB",
            description: "This Certified Refurbished product has been tested and certified 
                  to work and look like new, with minimal to no signs of wear, by a specialized
                  third-party seller approved by Amazon. The product is backed by a minimum 90-day warranty, 
                  and may arrive in a generic brown or white box. Accessories may be generic and not directly 
                  from the manufacturer.",
            image_path: "#{Rails.root}/app/assets/images/iphone.jpg"},

            {title:"A Mid-Back Mesh Chair",
            description: "Ergonomic office chair with contoured mesh back for breathability
                  Pneumatic seat-height adjustment; padded seat for comfort.",
            image_path: "#{Rails.root}/app/assets/images/chair.jpg"}
 ]

 u = User.create([ email: 'a@a.com' ,  password: '123456' ,password_confirmation:'123456',is_admin:true])
 puts "create a adminer"

 p1 = Product.create([title:products[0][:title],description:products[0][:description],quantity:20,price:30,image:open(products[0][:image_path])])
 p2 = Product.create([title:products[1][:title],description:products[1][:description],quantity:20,price:30,image:open(products[1][:image_path])])
 puts "create products"

这已经是一个数组啦,而且还是二维的,但是有一个小问题,他的图片都是放在文件夹里的,上传到heroku上容易报错,还得预编译,麻烦呀,增加出错概率的事情,我是肯定不会做的!

后来应该是在slack上看到的,具体在哪里找不到了,好像是一个做鲜花的同学问的,仿照着写出了这么个东西:

title = [
    "北京烤鸭",
    "大闸蟹",
    "东坡肉",
    "剁椒鱼头",
    "法式鸡公煲",
    "宫保鸡丁",
    "锅包肉",
    "过桥米线",

    "煎饼果子",
    "麻辣香锅",
    "墨西哥肉卷",
    "三明治",
    "三文鱼扒 ",
    "水煮鱼",
    "小笼包",
    "红烧肉"
  ]

  images = [
    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrq4hl3blj30rs0jqdjg.jpg",
    "http://ww2.sinaimg.cn/large/006tNbRwgy1ffrqa6g8lbj30i80r540z.jpg",
    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqaet2crj308c0693yt.jpg",
    "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqalyuc6j30dw09bgm7.jpg",
    "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqarbpb1j30dc06odgw.jpg",
    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqb1t147j30r80kfdkw.jpg",
    "http://ww2.sinaimg.cn/large/006tNbRwgy1ffrqb83ynaj30hs0a3diy.jpg",
    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqbeb3lgj30b408ctd5.jpg",

    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqbtofakj30c807sdgi.jpg",
    "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqceyovbj30m80etgx2.jpg",
    "http://ww1.sinaimg.cn/large/006tNbRwgy1ffrqcrtif5j30h40cu75f.jpg",
    "http://ww1.sinaimg.cn/large/006tNbRwgy1ffrqd72vprj30p00e2my3.jpg",
    "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqdgbtptj30ec09k42j.jpg",
    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqdo4poej30dw099wfq.jpg",
    "http://ww1.sinaimg.cn/large/006tNbRwgy1ffrqe008olj30le0c8q9k.jpg",
    "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqbloodsj30p00gowj0.jpg"
  ]

  for i in 0..15 do
    Product.create!(
    title: title[i],
    description:"这只是底料,请去实验室DIY!",
    quantity:rand(6..10),
    price:rand(50..100)*10,
    image: open(images[i])
    )
  end

可以的呦,两个一维数组。图片事先用ipic转成链接,也可以仿照这个把description也写成一个数组,很方便。

多图上传

做了多图上传之后,问题又产生了,logdown上找到了这篇文章:

http://yammy-blog.logdown.com/posts/1497305

第一遍还没看懂,修行不够呀,其实核心就几行:

 p1 = Product.create([title:products[0][:title],description:products[0][:description],body:products[0][:body],category:products[0][:category],quantity:rand(3..9) * 100 ,price:rand(1..5)])

 Photo.create!(product_id:1,avatar: open(photos[0]))
 Photo.create!(product_id:1,avatar: open(photos[1]))

第一行是商品建立,第二行是第一个商品的第一张图片,第三行是第二个商品的第二张图片。

重复操作这三行程序,就可以达到多图上传的目的。

但是这样的写法又需要把图片放在文件夹里,感觉好像还退步了...... 上一次还能写循环呢,这一次就只能一条一条写了啊!

更好的写法

还是研究了一维数组:

 title = [
     "北京烤鸭",
     "大闸蟹",
     "东坡肉",
     "剁椒鱼头",
     "法式鸡公煲",
     "宫保鸡丁",
     "锅包肉",
     "过桥米线",
 ]

 image1s = [
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrq4hl3blj30rs0jqdjg.jpg",
     "http://ww2.sinaimg.cn/large/006tNbRwgy1ffrqa6g8lbj30i80r540z.jpg",
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqaet2crj308c0693yt.jpg",
     "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqalyuc6j30dw09bgm7.jpg",
     "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqarbpb1j30dc06odgw.jpg",
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqb1t147j30r80kfdkw.jpg",
     "http://ww2.sinaimg.cn/large/006tNbRwgy1ffrqb83ynaj30hs0a3diy.jpg",
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqbeb3lgj30b408ctd5.jpg",
image1s = [
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqbtofakj30c807sdgi.jpg",
     "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqceyovbj30m80etgx2.jpg",
     "http://ww1.sinaimg.cn/large/006tNbRwgy1ffrqcrtif5j30h40cu75f.jpg",
     "http://ww1.sinaimg.cn/large/006tNbRwgy1ffrqd72vprj30p00e2my3.jpg",
     "http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqdgbtptj30ec09k42j.jpg",
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqdo4poej30dw099wfq.jpg",
     "http://ww1.sinaimg.cn/large/006tNbRwgy1ffrqe008olj30le0c8q9k.jpg",
     "http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqbloodsj30p00gowj0.jpg"
 ]

 for i in 0..7 do
     Product.create!(
     title: f_title[i],
     description:"这只是底料,请去实验室DIY!",
     quantity:rand(6..10),
     price:rand(50..100)*10,
     )
 end

 for i in 0..15 do
    Photo.create!(product_id: (i+1) ,avatar:open(image1s [i]))
    Photo.create!(product_id: (i+1) ,avatar:open(image2s [i]))
end

看起来是不是顺眼多啦。

需要注意的地方

两个循环得分开写,合到一起的写法,还没成功,有人研究出来的话,请告诉我吧,谢谢。

单图更好的写法

其实有人已经写过了seed上传的分享,本来不想写的,但今天看到了一个写法,感觉更好!

上面的写法有一个问题,就是数组元素太多的时候,要更换的话,还的去重读小学数学,一个一个数,有点笨,今天有翻到这样的写法

products_info = [
 {title: 'a', description: '4',image: 'http://ww4.sinaimg.cn/large/006tNbRwgy1ffrq4hl3blj30rs0jqdjg.jpg'},
 {title: 'b', description: '3',image: 'http://ww2.sinaimg.cn/large/006tNbRwgy1ffrqa6g8lbj30i80r540z.jpg'},
 {title: 'c', description: '2',image: 'http://ww4.sinaimg.cn/large/006tNbRwgy1ffrqaet2crj308c0693yt.jpg'},
 {title: 'd', description: '1',image: 'http://ww3.sinaimg.cn/large/006tNbRwgy1ffrqalyuc6j30dw09bgm7.jpg'},
]

products_info.each do |info|
     Product.create!(
         title: info[:title],
         description: info[:description],
         quantity: rand(5..6),
         price: rand(5..6),
         image: open(info[:image])
         )
 end

这样看起来直观多了不是么。终于告别了小学数学,开心呦。

PS:本贴案例用于我们的jdstore作品第四版黑暗料理模块,希望你能帮我们做下测试和提意见,如果喜欢请帮我们投上一票。谢谢你能读到最后。

这有一些其他的教程 可能对你有帮助

这可能是全栈营最详细的【带缩略图的轮播图】教程

这可能是全栈营最详细的【省市区详细地址】教程

这可能是全栈营最详细的【下拉菜单和按钮失效】解决办法]

这可能是最详细的全栈营【seed】教程

这可能是最容易出现的全栈营【七牛云上传】教程

这可能是全栈营最详细的【客服系统】教程

欢迎随时和我交流

Comments

comments powered by Disqus