最初の質問に答えるために、入力テーブルのすべての行がTranslationsテーブルに参加するため、結合されたすべての行は、Translationsテーブルからvalue
でソートされます。
入力テーブルに対してクエリに条件を指定しないでください。入力テーブルのすべての行が使用されますが、これはあなたの意図です。
あなたはほぼ確実にjoins
を意味するときに、includes
をクエリに使用しています。これらは多くの場合構文的に互換性がありますが、目的が異なるため意味的です。
includes
は、具体的にはeager loadingを容易にするために提供され、一方joins
は、joining tablesをサポートすると定義されています。経験則では、クエリで結合テーブルの列のいずれかを使用する場合は、joins
を使用します。そうでない場合は、includes
を使用して関連付けを熱心に読み込むことができます。
あなたが得ようとしている結果は、SQLだけではかなり困難です。ただし、入力行と関連付けを簡単に取得し、単純なRubyコレクション変換を使用して、翻訳の欠損値のプレースホルダを含め、必要な結果を得ることができます。
これを試してください:
languages = Language.all.order("name")
inputs = Input.includes(:translations).order("id")
translations = inputs.map do |input|
{
input.id => languages.map do |language|
item = input.translations.find_index {|i| i.language_id == language.id }
item ? nil : input.translations[item]
end
}
end
これはハッシュの配列が返され、そのキーとごとに供給される翻訳の8列のテーブルとしてinput.id
。 nil
は、入力のために存在しない翻訳のプレースホルダーとして使用されます。そのため、ビュー内の指示として "Translate ..."オプションを挿入することができます。これは、使用することができる方法である:
明らか
<table>
<% inputs.each do |input| %>
<tr>
<% translation = translations[input.id] %>
<% translation.each do |item| %>
<% item %>
<td class="translation-available"><%= item.value %></td>
<% else %>
<td><%= link_to "Translate...", translate_input_path(input) %></td>
<% end %>
</tr>
<% end %>
、私はinputs
配列を処理する方法をお見せするために、いくつかの構造とデザイン要素に嘲笑しました。必要に応じて、ビュー構造に合わせて変更することができます。
ありがとう、入力テーブルが正常に動作します。さて、入力言語をアルファベット順に並べ替えるにはどうしたらいいですか? –
コードの最初の行は 'languages = Language.all.order(" name ")'です。注文するフィールドを変更すると、ここに表示される言語の順序が変更されます。私はあなたの言語モデルが 'name'フィールドを持っていると仮定していますが、あなたの目的に合わせてここに最も適したフィールドを置くことができます。 –