我在自定义Ruby脚本中使用Active record 5.
(控制器/佣金任务)
books.each do |book|
b_id = book[“b_id”]
bk = Books.where(book_id: b_id).first
bk = Books.new(book_id: b_id) unless bk
bk.update_book_info(book)
if bk.changed?
# ...send book title to Api...
bk.save!
end
end
(型号)
class Book < ActiveRecord::Base
before_save :get_title
def update_book_info(book)
@book = book
end
private
def get_title
# do ..something
self.title = @book[’title’]
end
end
books
是一个数组。
请注意[...send book title to Api...]
部分。我需要知道
书名,以便我可以将其发送给API。我尝试了bk.title
,但它返回null
!
如何获得书名?
另外,我可以将更多代码从控制器移动到模型吗?
帮助:)
答案 0 :(得分:0)
如果它返回nil
...那么它是空的。
检查rails控制台中的对象。
在您的终端中,运行:
rails c
然后:
Book.first # see the whole object
Book.first.title # see its title
Book.all.pluck(:title) # see all the titles in the database
如果没有出现错误导致标题无法保存,您可能需要查看保存图书的位置。
旁注:在您的代码中,您正在进行一些不必要的查询。
在each
循环中,您要查询数据库中已有的对象。
这一行:
bk = Books.where(book_id: b_id).first # useless query
将返回从中提取book
的同一id
对象。
此外,在查找具有id的对象时,不需要使用where
,因为id是唯一的,它只能返回一个对象。使用#find
或#find_by
。
答案 1 :(得分:0)
而是创建方法#update_book_info
,您可以使用#assign_attributes(new_attributes)
,如下所示:
bk.assign_attributes(book)
它将保证您的模型将 dirt 并且#changed?
方法将起作用。此外,您的bk#title
将在#save
之前加载,这似乎是您想要的。
然后,您也可以删除before_save
和#get_title
。