从模型 - Active Record 5 / Rails获取更改的数据

时间:2017-09-03 12:23:41

标签: ruby-on-rails ruby activerecord

我在自定义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

如何获得书名?

另外,我可以将更多代码从控制器移动到模型吗?

帮助:)

2 个答案:

答案 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