Rails中的数据库保存行为,模型与控制台

时间:2015-02-20 03:10:59

标签: ruby-on-rails ruby ruby-on-rails-4 mysql2

编辑:解决了,我不得不将序列化列从类型整数更改为类型文本,因为int不能用于序列化。

是否有一些保存到我错过的数据库?我正在尝试将数组保存到数据库列。我正在使用序列化,以便我可以在列中存储多个团队ID。如果我在rails控制台中执行它,它可以工作,但是当我从我的模型中执行它时似乎不起作用。

以下是Rails控制台中的作用:

match_entry = Match.new
match_entry.team_ids << 1
match_entry.team_ids << 2
match_entry.save

保存后,我看到match_entry.team_ids包含[1,2]。以下是我的模型中无法使用的内容:

file.each_line do |line|
    if line.include?("team_ids")
        str = line.sub("team_ids:", "").chomp
        arr = str.split(",")
        match_entry.team_ids << arr[0].to_i
        match_entry.team_ids << arr[1].to_i
    end
end
match_entry.save

match_entry.team_ids甚至正确地返回[1,2],但它似乎并没有真正保存到数据库中。它将保存到数据库,没有team_ids的值。

2 个答案:

答案 0 :(得分:0)

很难从模型中的代码片段中判断出您正在执行的操作是在对象Match的实例上运行,还是在Class Match上运行,然后创建一个新的Match对象保存。

无论你如何做,我认为你的问题是你在模型中操作的Match实例对象在操作后没有被保存。如果从before_save回调调用,您的代码块应该按照写入的方式工作。

class Match
 before_save :add_team_ids

private
 def add_team_ids
  self.team_ids << 1
  self.team_ids << 2
 end
end

在after_save回调中,你需要再次保存,因为在after_save回调被触发之前首次保存了对象。

class Match
 after_save :add_team_ids

private
 def add_team_ids
  self.team_ids << 1
  self.team_ids << 2
  self.save
 end
end

答案 1 :(得分:0)

我发现序列化不适用于整数,因此我必须将列更改为文本类型才能使其正常工作。