检查模型范围内是否有 locale_restriction
Check if model has locale_restriction in scope
考虑一个模型 Post,它有一个 title
、description
和一个 locale_restrictions
字段。
区域限制字段指定 post 应在哪些区域显示。它包含一个 CSV 值:en,de,be,nl
.
我想做的是使用 default_scope 或命名范围仅 return 特定语言环境的模型实例。类似于(具有 localized
范围):Post.localized.all
。然后,此范围会查看当前语言环境 I18n.locale
和 return 在其 locale_restrictions
CSV 中具有该语言环境的 post。
我似乎无法正常工作,尝试了很多选项。我最接近的是 SQL LIKE
表达式:
default_scope -> { where("locale_restrictions LIKE (?)", "%#{I18n.locale.to_s}%") }
但是,当同时存在 :en
和 :benl
语言环境时,这会失败,因为 %en%
将匹配 :benl
.
显然您无法访问范围内的 self.locale_restrictions
。 self
return 是 class 而不是实例。我想不出拆分 locale_restrictions 并检查它们的方法。
使用作用域解决此问题的最佳方法是什么,或者是否有任何我遗漏的关于本地化数据库的最佳实践?
我基本上是在寻找一种简单的方法来将我的控制器实例变量的范围限定到特定的语言环境。任何帮助将不胜感激。
您可以使用 REGEXP 代替 LIKE,并在正则表达式中包含词首和词尾边界。这应该可以解决问题:
default_scope -> { where("locale_restrictions REGEXP (?)", "[[:<:]]#{I18n.locale.to_s}[[:>:]]") }
考虑一个模型 Post,它有一个 title
、description
和一个 locale_restrictions
字段。
区域限制字段指定 post 应在哪些区域显示。它包含一个 CSV 值:en,de,be,nl
.
我想做的是使用 default_scope 或命名范围仅 return 特定语言环境的模型实例。类似于(具有 localized
范围):Post.localized.all
。然后,此范围会查看当前语言环境 I18n.locale
和 return 在其 locale_restrictions
CSV 中具有该语言环境的 post。
我似乎无法正常工作,尝试了很多选项。我最接近的是 SQL LIKE
表达式:
default_scope -> { where("locale_restrictions LIKE (?)", "%#{I18n.locale.to_s}%") }
但是,当同时存在 :en
和 :benl
语言环境时,这会失败,因为 %en%
将匹配 :benl
.
显然您无法访问范围内的 self.locale_restrictions
。 self
return 是 class 而不是实例。我想不出拆分 locale_restrictions 并检查它们的方法。
使用作用域解决此问题的最佳方法是什么,或者是否有任何我遗漏的关于本地化数据库的最佳实践?
我基本上是在寻找一种简单的方法来将我的控制器实例变量的范围限定到特定的语言环境。任何帮助将不胜感激。
您可以使用 REGEXP 代替 LIKE,并在正则表达式中包含词首和词尾边界。这应该可以解决问题:
default_scope -> { where("locale_restrictions REGEXP (?)", "[[:<:]]#{I18n.locale.to_s}[[:>:]]") }