考虑一个具有title
,description
和locale_restrictions
字段的模型帖子。
语言环境限制字段指定应在哪些语言环境中显示帖子。它包含CSV值:en,de,be,nl
。
我想要做的是使用default_scope或命名范围来仅返回特定区域设置的模型实例。类似于(localized
范围):Post.localized.all
。然后,此范围会查看当前的区域设置I18n.locale
,并返回其locale_restrictions
CSV中包含该区域设置的帖子。
我似乎无法让这个工作,尝试了很多选择。我最接近的是一个SQL LIKE
表达式:
default_scope -> { where("locale_restrictions LIKE (?)", "%#{I18n.locale.to_s}%") }
但是,如果有:en
和:benl
区域设置,则会失败,因为%en%
将匹配:benl
。
显然,您无法访问范围内的self.locale_restrictions
。 self
返回类而不是实例。我无法找到一种方法来拆分locale_restrictions并检查它们。
使用范围进行此操作的最佳方法是什么,或者是否有关于我错过的数据库本地化的最佳实践?
我基本上寻找一种简单的方法将我的控制器实例变量范围扩展到特定的语言环境。任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用REGEXP而不是使用LIKE,并在正则表达式中包含词头和词尾边界。这应该可以解决问题:
default_scope -> { where("locale_restrictions REGEXP (?)", "[[:<:]]#{I18n.locale.to_s}[[:>:]]") }