不使用Rails的Ruby ActiveRecord不保存

时间:2012-10-15 06:46:08

标签: ruby activerecord

我有一个Pinterest Ruby爬虫(不在Rails中),我将数据写入JSON文件。 我为Pins创建了一个ActiveRecord。我还创建了一个方法,将数据从文件加载到mysql。 但是我的load_pins方法没有将任何数据加载到数据库中,但它确实为它们创建了空行。 我甚至放了一个调试器并尝试手动将一些数据加载到我的引脚表中,例如

pin = Pin.first
pin.field_id = 1
pin.user_id = 1
pin.save!

它甚至返回true,当我执行pin.user_id时它返回1,但在数据库中没有任何东西被保存,或者如果我只是尝试打印pin它显示为空的一切。

Pin Model:

require_relative '../database_configuration'

class Pin < ActiveRecord::Base 
  attr_accessor :field_id, :user_id, :board_id, :img_url, :is_repin, :is_video, :source, :link, :description, :user_name
  attr_accessible :field_id, :user_id, :board_id, :img_url, :is_repin, :is_video, :source, :link, :description, :user_name

  def to_json
    {
      field_id: field_id,
      user_id: user_id,
      user_name: user_name,
      board_id: board_id,
      img_url: img_url,
      is_repin: is_repin,
      is_video: is_video,
      source: source,
      link: link,
      description: description,
    }
  end
end 

我的Load_pins方法

def load_pins
  pins = JSON.parse(File.read('pins.json'))
  Pin.create!(pins)
end

Mysql的

mysql> select * from pins;
+----+----------+---------+----------+---------+----------+----------+--------+------+-------------+-----------+
| id | field_id | user_id | board_id | img_url | is_repin | is_video | source | link | description | user_name |
+----+----------+---------+----------+---------+----------+----------+--------+------+-------------+-----------+
|  1 |     NULL |    NULL |     NULL | NULL    |        0 |        0 | NULL   | NULL | NULL        | NULL      |
|  2 |     NULL |    NULL |     NULL | NULL    |        0 |        0 | NULL   | NULL | NULL        | NULL      |

知道为什么会这样吗?在Rails之外使用ActiveRecord时我是否遗漏了什么?

1 个答案:

答案 0 :(得分:2)

attr_accessor表格中删除pins所有字段。

如果添加验证,您将看到没有设置任何AR字段,因为attr_accessor会覆盖AR使用的“字段”。 AR不会查看attr_accessor定义的实例变量中的值,例如@field_id

我说上面的“字段”,因为AR实际上将所有字段值存储在attributes哈希中。 然后,AR定义从该散列读取/写入的方法。因此,field_id可以attributes[:field_id]访问,也可以field_id方式访问。