簡體   English   中英

我應該使用哪種方法將產品翻譯存儲在數據庫中?

[英]Which approach should I use to store translation of products in database?

我正在創建一個應用程序,客戶可以在該應用程序上創建產品(類似於電子商務網站),因此顯然我需要翻譯后的描述存儲在數據庫中,我不能強迫我的客戶學習git / yml。

對於如何正確地將描述(以及最終的產品名稱)本地化並將其存儲在數據庫中,我有兩個想法,但是如果有一種我應該使用的知名方法,我將非常高興知道。

第一個想法對我來說似乎是最合乎邏輯的,但是我想讓它對我“透明”,我不想到處都寫聯接,因此,如果是正確的話,應該提出一些有關如何實現這一點的建議贊賞。

想法1:創建一個數據庫表productsnamedescription字段可能設置為默認語言環境語言),然后創建一個products_translations表,其中包含以這種方式結構化的表:

products_translations
- id
- locale
- product_id
- name
- description

例如: product_translation: { id: 1, locale: 'en', product_id: 3, name: 'toy', description: 'play' }

但是我想訪問翻譯而無需到處寫很多IF。 因此,如果我編寫product.name,它應該返回en或基於當前語言環境。

獎勵:有什么寶石可以幫助我實現這一目標嗎?

想法2:另一個想法是用name_locale1name_it等創建一個表,但是我不喜歡這種方法,因為它將用字段污染我的模型對象,並且會有一個巨大的表。

但是,通過這種方式,我可以避免在該對象的每個查詢上進行聯接。

如果有一個我不知道的更好的方法(數據庫模式或類似方法),也可以,我並沒有被迫只局限於這兩個想法,但是我必須在這兩個想法之間做出選擇不知道哪個會更好。

重要提示:除動態內容外,我想將翻譯存儲在yml文件中,動態內容顯然需要數據庫中的翻譯。

我同意PinnyM的觀點,第一種方法是兩者中最好的,但是與其實施您自己的模式,不如不實施自己的架構,我強烈建議您實施Globalize3 ,因為大多數結構性決策都是為您做出的(福克斯先生本人也同樣如此) )。 同樣,使用rails helper,您只需在模型實例上調用product.name東西,gem就會弄清楚如何在正確的語言環境中顯示它,真棒!

第一種方法是推薦的方法。 如您所料,第二種方法不是那么干凈,因為您仍然必須加入這個怪物表,所以在編碼端需要做更多的工作,而沒有真正的收獲。 相反,第一種方法最多需要一個聯接,而第二種方法則需要對每個屬性添加一個聯接,您可能希望添加本地化支持。

您可以簡單地在所有產品調用上附加范圍,例如:

scope :for_locale, lambda{|locale| joins(:product_translations).
                                   where(product_translations: {locale: locale || 'en'}) }

並傳入會話語言環境(或存儲它的任何地方)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM