2

我有兩個模型和三個表總共涉及到。不幸的是,從原來的表名的車型有些重命名已經發生,所以請原諒後者,當然是使用Globalize3翻譯的困惑:通過Globalize3翻譯對使用語言環境的關聯進行ActiveRecord查詢響應排序

Symptom (chief_complaints) 
SymptomName (chief_complaint_names) 
(chief_complaint_name_translations) 

:在SymptomName模型的name屬性。症狀has_many:症狀名稱。

考慮以下幾點:

Symptom.includes(names: :translations).order("chief_complaint_name_translations.name ASC") 

這將返回一個主要是正確的列表,但它的排序由它遇到的第一個翻譯名稱症狀清單(儘管我的語言環境),並通過正確的區域列出。

# .to_sql output 
"SELECT `chief_complaints`.* FROM `chief_complaints` INNER JOIN `chief_complaint_names` ON `chief_complaint_names`.`chief_complaint_id` = `chief_complaints`.`id` INNER JOIN `chief_complaint_name_translations` ON `chief_complaint_names`.`id` = `chief_complaint_name_translations`.`chief_complaint_name_id` ORDER BY chief_complaint_name_translations.name, chief_complaint_name_translations.name ASC" 

# Actual SQL generated in the console 
SELECT `chief_complaints`.* FROM `chief_complaints` INNER JOIN `chief_complaint_names` ON `chief_complaint_names`.`chief_complaint_id` = `chief_complaints`.`id` INNER JOIN `chief_complaint_name_translations` ON `chief_complaint_names`.`id` = `chief_complaint_name_translations`.`chief_complaint_name_id` ORDER BY chief_complaint_name_translations.name, chief_complaint_name_translations.name ASC 
SELECT `chief_complaint_names`.`id` AS t0_r0, `chief_complaint_names`.`chief_complaint_id` AS t0_r1, `chief_complaint_names`.`created_at` AS t0_r2, `chief_complaint_names`.`updated_at` AS t0_r3, `chief_complaint_name_translations`.`id` AS t1_r0, `chief_complaint_name_translations`.`chief_complaint_name_id` AS t1_r1, `chief_complaint_name_translations`.`locale` AS t1_r2, `chief_complaint_name_translations`.`name` AS t1_r3, `chief_complaint_name_translations`.`created_at` AS t1_r4, `chief_complaint_name_translations`.`updated_at` AS t1_r5, `chief_complaint_name_translations`.`url` AS t1_r6 FROM `chief_complaint_names` LEFT OUTER JOIN `chief_complaint_name_translations` ON `chief_complaint_name_translations`.`chief_complaint_name_id` = `chief_complaint_names`.`id` WHERE `chief_complaint_name_translations`.`locale` = 'en' AND `chief_complaint_names`.`chief_complaint_id` IN (173, 2, 1, 224, 223, 3, 75, 4, 186, 15, 199, 201, 5, 177, 245, 94, 219, 225, 241, 6, 228, 213, 234, 164, 88, 26, 81, 7, 74, 136, 57, 21, 28, 18, 163, 165, 8, 112, 183, 147, 9, 160, 10, 64, 218, 170, 200, 207, 11, 175, 13, 138, 72, 12, 214, 239, 248, 14, 150, 190, 137, 16, 17, 154, 178, 127, 56, 206, 246, 101, 19, 20, 22, 96, 172, 255, 23, 24, 216, 25, 215, 29, 125, 113, 198, 195, 244, 27, 247, 132, 232, 70, 135, 133, 30, 31, 34, 32, 197, 181, 222, 208, 243, 35, 227, 196, 33, 36, 179, 53, 131, 126, 159, 58, 37, 202, 203, 38, 120, 68, 220, 230, 176, 39, 226, 148, 174, 91, 40, 41, 145, 151, 134, 189, 73, 43, 42, 47, 93, 44, 45, 46, 209, 192, 204, 205, 48, 188, 128, 49, 212, 249, 250, 211, 153, 50, 51, 52, 139, 187, 237, 109, 156, 129, 54, 157, 55, 87, 69, 84, 146, 60, 149, 221, 231, 242, 229, 59, 194, 240, 155, 61, 158, 62, 171, 180, 67, 63, 236, 65, 66, 162, 71, 152, 191, 76, 77, 78, 79, 80, 82, 83, 103, 92, 98, 118, 85, 100, 89, 116, 114, 115, 104, 99, 111, 86, 97, 122, 251, 90, 238, 193, 254, 95, 252, 130, 235, 233, 102, 121, 123, 105, 106, 107, 108, 110, 217) ORDER BY name 

您會注意到在此查詢中沒有提及「locale」或「en」。如果我對SymptomName執行查詢,包括with_translations方法,將語言環境傳遞給它,它將完全按照我的預期寫入查詢。

>> SymptomName.with_translations(I18n.locale).to_sql 
=> "SELECT `chief_complaint_names`.* FROM `chief_complaint_names` WHERE `chief_complaint_name_translations`.`locale` = 'en' ORDER BY name" 

我怎樣才能正確地注入的語言環境到第一個查詢,並將它根據相關SymptomNames排序我的症狀的列表。值得注意的是,我在Symptom上有一個方法,它返回遇到的第一個SymptomName。

我需要這個按名稱從locale派生的名稱和顯示正確的名稱。有什麼想法嗎?

謝謝!

回答

0

只是使用這顆寶石的其他人的小小更新。我很驚訝地發現,創業板實際上爲每個有翻譯的模型創建一個新的模型。這款新機型與原版名稱相同,並附有::Translation。所以SymptomName將有一個SymptomName::Translation模型。該模型具有可翻譯的屬性,如SymptomName::Translation.first.name

不幸的是,這個新模型似乎並沒有像人們預料的那樣直接訪問它的同名。沒有SymptomName :: Translation.first.symptom`。

對所有關聯的反思確實揭示了與來自翻譯模型的所述模型的關係,但該關聯不能通過正常鏈獲得。

我們最終創建了我們自己的模型來訪問這個名爲SymptomNameTranslation的表,並將相應的關聯和連接添加爲default_scope。似乎工作很好,但很高興在寶石本身擁有這一點。可能是一個補丁說寶石的好機會。

相關問題