如何解决使用Mobility 上下文问题
上下文
考虑到具有sluggable
多态关系的Rails 6应用程序,可以将模型的has_many
本地化为不同语言的代码集合建模如下:
# slugs table schema
create_table :slugs do |t|
t.references :sluggable,polymorphic: true
t.string :locale,null: false
t.string :slug,null: false
t.timestamps null: false
end
add_index :slugs,[:locale,:slug],unique: true
# app/models/slug.rb
class Slug < ApplicationRecord
belongs_to :sluggable,polymorphic: true
end
# app/models/post.rb
class Post < ApplicationRecord
has_many :slugs,-> { where(locale: I18n.locale).order(created_at: :desc) },as: :sluggable
end
# app/models/course.rb
class Course < ApplicationRecord
has_many :slugs,as: :sluggable
end
这应满足以下要求:
-
sluggable
在每种语言中可以有不同数量的slugs
(一种语言的词条与另一种语言的子词之间没有直接映射); - 一个约束条件确保该块对于每个语言环境都是唯一的(
sluggable_type
可以包含在索引中,这取决于一个希望块在整个应用程序中是唯一的还是在每种模型类型中都是唯一的); - 需要一个单一的联接(负责翻译和子词组 post关系);
- 该关系保持其顺序以允许选择“默认”
slug
。
可以用post.slugs
查询帖子的内容。按照惯例,帖子的“默认”标签为post.slugs.first
。
可以按以下语言环境和提示找到帖子:
Post.includes(:slugs).find_by(slugs: { "my-slug" })
问题
如何使用mobility库实现等效效果?我已经在应用程序的其余部分中使用了此翻译库,并希望能够以一致的方式查询翻译后的内容。
key-value backend documentation似乎符合要求#3的要求,即mobility_string_translations
表是一个多态关系,看起来它可以代替slugs
表。但是,关于#2,它在["translatable_id","translatable_type","locale","key"]
上声明了唯一索引,因此对于给定的sluggable
和语言环境,它不允许多个段。该文档显示了如何在每个语言环境中转换具有单个值的属性(例如,带有Post
的{{1}}),而不是具有多个值(例如,具有多个{{1} },如上所述。
mobility是否支持上述方案,还是可以/应该用某种新的后端实现?
PS:我也打开了a GitHub issue。
PPS:In this SO question我还考虑了将这些块存储在JSONB数组中的可能性,但这是recommended against,还有移动性can only translate string
and text
types。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。