将文件存储视为 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_save
和 after_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
我有一个 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_save
和 after_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