如何改写Ruby内联代码为块代码并将变量值存入数据库?
解决Ruby中tap块内获取参数并赋值存库的问题
首先,你之前写的 .tap { m.each do puts m.inspect end } 确实有语法错误——each 的块缺少参数声明(应该是 do |item| ... end),而且这个写法和你原本要获取 l、f 的需求不搭边,因为 l 和 f 是来自 el 方法的块参数,不是对 m 迭代得到的。
回到你的原始代码,我们可以直接在 el 方法的块里处理 l 和 f 的赋值与存储逻辑,结合 tap 的特性(它会把调用对象传给块,然后返回原对象,适合链式调用中执行副作用),正确的写法应该是这样:
.tap do |m| el(m, 3, 4) do |l, f| # 直接把l、f赋值给变量 last_name = l first_name = f # 这里写存入数据库的逻辑,比如用ActiveRecord模型的话: Patient.create(last_name: last_name, first_name: first_name) end end
如果 el 方法会多次触发块(也就是产生多组 l、f),你也可以先把这些数据收集到数组里,再批量存入数据库,这样效率更高:
patient_records = [] .tap do |m| el(m, 3, 4) do |l, f| patient_records << { last_name: l, first_name: f } end end # 批量插入数据库 Patient.insert_all(patient_records)
另外要注意:如果你的代码不是链式调用的一部分,其实可以不用 tap,直接调用 el 方法处理就行——tap 主要的作用是在不打断链式调用的前提下,执行一些副作用操作(比如存库、打印日志)。
内容的提问来源于stack exchange,提问作者user2932090
相关产品推荐
相关产品推荐

