Как получить значение из таблицы составного ключа, используя модель Rails? - PullRequest
0 голосов
/ 02 марта 2010

У меня есть следующая схема (* означает первичный ключ):

languages
  id*
  english_name
  native_name

native_to_target_language
  native_language_id*
  target_language_id*
  target_language_name
  overview_text

(target_language_name - это название целевого языка, написанное на родном языке).

Я хочу получить значение target_language_name из таблицы native_to_target_language, учитывая значения для native_language_id и target_language_id.

Каков наилучший способ получить это? Использовать составные первичные ключи из http://compositekeys.rubyforge.org/? Существует ли стандартный способ БЕЗ использования необработанного SQL-запроса?

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Не очень понятно, нужны ли вам операции CRUD.Если вы хотите найти, то вы можете сделать следующее:

NativeToTargetLanguage.find(:all, :conditions => {
        :native_language_id => native_language_id,
        :target_language_id => target_language_id }
)
1 голос
/ 02 марта 2010

Вместо того, чтобы использовать собственную систему перевода, вы исследовали какие-либо "готовые" разновидности?

Например, есть Глобализация , которая делает многое для вас.

Наличие таблицы с составным ключом, представляющей соединение одной записи в таблице с другой, будет такой большой проблемой. Как правило, вам необходимо поддерживать ассоциацию A <-> B как пару разновидностей A-> B и B-> A.

Как насчет общего примера:

class Language < ActiveRecord::Base
  belongs_to :phrase
  has_many :translations,
    :through => :phrase
end

class Phrase < ActiveRecord::Base
  has_many :translations
end

class Translation < ActiveRecord::Base
  belongs_to :language
  belongs_to :phrase
end

В этом случае фраза - это вид записи, представляющей переводимый термин. В зависимости от обстоятельств он может обозначать «французский», «английский» или «нажмите здесь».

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

Например, примерно:

<%= link_to(Language.find_by_code('fr').phrase.translation.find_by_language_id(session_language_id), '/fr') %>
0 голосов
/ 02 марта 2010

Звучит так, как будто вы хотите что-то вроде Полиморфные ассоциации . Для этого потребуется отдельная таблица для каждого языка, и это (я думаю) то, что вы обсуждаете.

Однако, похоже, что может быть лучшее решение вашей проблемы. В частности, вам может быть предложена лучшая схема для решения этой проблемы (если база данных уже используется и вы создаете приложение Rails, чтобы попытаться получить к нему доступ).

Можете ли вы описать общую проблему, которую вы пытаетесь решить?

...