【发布时间】:2018-02-16 16:12:41
【问题描述】:
我遇到了问题,不知道如何解决。
我基本上有一个与另一个 ModelB 有 has_many 关系的 ModelA。假设 ModelB 有两个属性。一个created_at 和一个filename。现在假设 created_at 由于竞争条件实际上并不准确。但是,filename 包含一个准确的时间戳。不幸的是,文件名也不一致,事先提取和添加时间戳不是一种选择。
有没有办法做这样的事情?
class ModelA
has_many: model_bs, order: extracted_timestamp_from_filename.asc
def extracted_timestamp_from_filename
#self would ideally be a single model_bs
extract_timestamp_from_filename(self.filename)
end
end
至少对于order,我认为如果没有实际正确的时间戳属性,这将永远无法工作。有没有办法获得这个功能?如果有办法用钩子做到这一点,我还没有找到。
【问题讨论】:
-
我不明白你的问题。为什么你不能这样写
has_many: modell_bs, order: :updated_at -
因为正如我所描述的,我唯一可用的准确时间戳在文件名中。不幸的是,文件名的命名也不一致。因此,只有一种方法可以获得有效的时间戳 - 获取文件名,提取时间戳......
-
从文件名中提取时间戳是个坏主意。一般来说,因为订购它是一个简单的 SQL 操作,它不应该获取所有文件名并从中删除时间戳。我相信可以使用一些正则表达式。但是为什么你需要如此复杂的排序。更好的是添加到
ModelB新字段true_timestamp并按它订购。您只需要编写一个脚本来生成该字段,或者您可以在rails console中进行。我的想法听起来很曲折,但它仍然比按 SQL 表中不存在的某些字段排序要好。 -
这个场景并不取决于我,因为它是一个我只能有限访问的遗留系统。我想那时没有代码解决方案。
-
“文件名包含时间戳”是什么意思?你能举一些示例文件名吗?
标签: ruby-on-rails activerecord activemodel