【问题标题】:Database save behavior in Rails, model vs consoleRails,模型与控制台中的数据库保存行为
【发布时间】:2015-02-20 03:10:59
【问题描述】:

编辑:已解决,我不得不将序列化列从整数类型更改为文本类型,因为 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 没有任何值。

【问题讨论】:

  • 什么版本的导轨?
  • @FrederickCheung,这是 Rails 4.2.0 rc1

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


【解决方案1】:

很难从模型中的代码 sn-p 判断您正在执行的操作是在对象 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

【讨论】:

  • 我认为你可能是对的。我有一个名为 Match 的类,在它的一个方法中,我做了 match_entry = Match.new。我认为这可能是导致问题的原因,我会调查一下,谢谢!
  • 不客气。您应该只需要在该方法中执行 match_entry.save 以获取要保存的新对象。
  • 有趣。我已经在调用 match_entry.new 的方法中调用了 match_entry.save,但它似乎不起作用。我现在无法尝试一些事情,但也许今晚晚些时候。
  • 在更改任何内容之前,我尝试为非序列化列设置值,它们工作得非常好。只有当我在序列化列上尝试它时它似乎不起作用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多