【问题标题】:Ruby on Rails has_many association define custom orderingRuby on Rails has_many 关联定义自定义排序
【发布时间】: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


【解决方案1】:

这并不是真正的修复,但事实证明带有 MongoDB 的 Rails 实际上能够按字符串排序,而且碰巧我的示例中的文件可以像这样排序。但是,如果文件名有不同的格式,这仍然不起作用。在我的例子中,我想我现在可以侥幸逃脱。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多