又一个红宝石问题,但这是一堆问题。我真的开始喜欢rails了,但有些问题我想直接问。
现在,我正在sqlite中实现一个队列。我已经有一个脚手架设置,这个工作正常。目的是让网络爬虫读取数组并确定接下来应该抓取哪些链接。
程序中的架构是2个控制器。一个用于Job,一个用于crawler。 Jobs有脚手架提供的标准Crud接口。在我跌倒的地方,我仍在努力了解这些事情是如何与彼此沟通的。
Job的格式为url:string和depth:decimal。该表已经填充了大约4个对象。
@sitesToCrawl = Job.all
@sitesToCrawl.each {|x|puts Job.url}
我对上述问题有很多疑问。
目前,这应该显示所有作业,我愚蠢地认为它会显示纯文本,但它实际上是指向对象本身的十六进制指针。我想要做的是遍历@sitesToCrawl并输出每个Jobs url。
问题从这里开始:
1:我知道ruby是动态类型的。将@sitesToCrawl变成一个数组,就像我希望每个包含一个作业的插槽一样。
2:@ sitesToCrawl.each非常简单,我假设它是一个迭代器。
X是方法的名称或者| * |
3:Puts和print是或多或少相同的是吗?如果我说@x = puts 3那么x会是3吗?
4:Job.url。可以通过这种方式引用对象,还是应该使用
#@sitesToCrawl = db.execute("SELECT url FROM jobs;")
其中db是一个新数据库
答案 0 :(得分:1)
正如Rubish Gupta指出的那样,在你的区块中,你应该x.url
,否则你试图访问类作业上的url
方法,而不是Job的实例。换句话说,在块中,管道中的项是块的参数,each
将遍历您的数组,一次传入一个项目到块。查看文档here.
只是为了扩展这个想法,each
Hash
es(关联数组,地图,无论你知道什么)都会将两个变量传递给你的块:一个键和一个值,如下:
a_hash.each {|key_var, val_var| puts "#{key_var} is associated with #{val_var}"}
此外,由于我已经完成了普通的ActiveRecord模型,但是你可能会考虑这样做
@sitesToCrawl = Job.all.to_a
因为Job.all是 lazy finder ,因为它正在构建一个潜在的查询:你基本上构建了一个查询字符串SELECT * FROM jobs
,但它可能不是执行直到您尝试访问这些项目。 each
可能会这样做,我记不清了,但是如果您使用调试器来查看它,我知道您需要to_a
来运行查询
你绝对应该使用job_instance.url
- 这就是ActiveRecord的美妙之处,只要一切设置正确,它就可以轻松访问数据库:)
最后,puts和print 几乎相同 - 区别在于puts "string"
必须print "sting"; STDOUT.flush
- 它会在语句的末尾刷新。