将文件存储视为 table 中的一列

Treating the file store as a column in the table

我有一个 Blog 模型,其内容将存储在一个文件中,其余内容将存储在 table。

我的解决方案如下

我用 getter/setter 方法创建了一个虚拟属性。

def content
    File.read(file_path)
end

def content=(html)
    File.open(file_path, "w") do |file|
        file.write(html)
    end
end

但是这里我遇到了一个问题,我只想在记录有效的情况下将 html 内容存储到一个文件中,但是当我在控制器中说出如下内容时

Blog.new(:content => html,:title => "Title".......)

我的setter在设置其他属性之前先被调用。 由于其他属性已通过 presence true 验证,因此记录将无法保存,但我的文件仍将被存储。

所以现在我想要一个解决方案,只有当记录有效并被存储时才会创建文件。

我认为在这里使用 before_saveafter_find 回调可能会更好。将访问器添加到 class 以允许在 creating/updating 内容时将属性存储在内存中。然后当你保存到数据库时,将内容保存到一个文件中。从数据库加载记录时,从文件加载内容并使用相同的访问器存储它

class Post
  attr_accessor :content
  before_save :save_to_disk
  after_find :load_from_disk

  def save_to_disk
    File.open(file_path, "w"){ |f| f.write(content) }
  end

  def load_from_disk
    File.open(file_path){ |f| self.content = f.read }
  end

end