2015-12-22 2 views
2

У меня есть две таблицы следующим образом:Пользовательские внешние ключи с Rails

+-----+ 
Software 
+-----+ 
id 
name 
latest_version [Field that needs to be implemented] 


+-----+ 
Versions 
+-----+ 
id 
version_string 
released_date 

Я определил has_many :versions в Software модели и belongs_to :software в Version модели, чтобы связать их.

Теперь проблема в том, что мне нужно получить последнюю версию на основе выпущенной даты и сохранить другую ссылку в таблице Software для более быстрого поиска. Итак, как я могу сделать столбец latest_version ссылкой на одну строку в таблице Версии с Rails? Или это плохая практика?

UPDATE: Я уже установил именованный объект latest_version в модели Версии, чтобы получить последнюю версию. Тем не менее, я думаю, что это не лучший вариант, если приложение масштабируется (я думаю)

ответ

3

Я думаю, было бы семантически правильным изменить имя поля на latest_version_id.

Затем вы можете реализовать что-то подобное.

has_one :latest_version, class_name: "Version", foreign_key: "latest_version_id" 

или с помощью рамки (не знаю, как вы Реализована)

has_one :latest_version, -> { order 'created_at' }, class_name: "Version" 
+0

Да, я уже пробовал ваше первое решение. Я использовал это в файле миграции: 't.integer: version,: latest_version_id'. –

+0

Тогда, пока ваши таблицы проиндексированы, вам не о чем беспокоиться. –

+0

Когда я вызываю команду 'Software.first.latest_version', я получаю следующую ошибку: Version Load (0.0ms) SELECT' versions'. * FROM 'versions' WHERE' versions'.'latest_version_id' = 1 LIMIT 1 Mysql2 :: Ошибка: Неизвестный столбец «version.latest_version_id» в «where clause»: SELECT 'versions'. * FROM' versions' WHERE 'versions'.'latest_version_id' = 1 LIMIT 1 –

1

U можно попробовать кэширование, как описано в Ryan Bate's railscast episode on model caching. Суть его в том, что u может хранить last_version_id как кеш в памяти без необходимости создавать другой столбец или запрашивать базу данных каждый раз при загрузке модели.

Единственный раз, когда вам нужно обращаться к базе данных, чтобы получить последнюю версию является

1) в первый раз, когда и кэшировать latest_version_id,

2) по истечении срока действия кэша или

3) при наличии новой версии или

4) при обновлении версии (неверный ключ в дате выпуска).

Для 3 и 4, Ryan использует обратный вызов after_save для истечения срока действия кэша. Что произойдет после этого, так это то, что приложение загрузит и реализует theres no cache для last_version_id, поэтому он будет запрашивать для него базу данных, используя метод scope. При этом он снова заполняет кеш, и в следующий раз, когда потребуется загрузить последнюю версию, он не запрашивает базу данных.

+0

Я обязательно попробую и сообщу о результатах. Благодаря.. :) –

Смежные вопросы