2016-07-28 13 views
0

これは宿題に関する質問ではありません。私はもっ​​と学びたいと思っています。Ruby on Railsを使用してAからBまでの順番

私は属性
Manufacturer {name} //ストアManufactueres
Model {manufacturer_id, name} //ストアモデル
Tint {manufacturer_id, model_id, front, side, rear} //ストア測定

私は私のTintエンティティでフォローデータを持っていると次のエンティティを持っています。アルファベットは異なるメーカー名とモデルを表します。

Manufacturer | Model | Front | Side | Rear | 
-------------+-------+-------+------+------- 
A   | AD | 10 | 10 | 10 | 
B   | AB | 10 | 10 | 10 | 
A   | AA | 10 | 10 | 10 | 
A   | AC | 10 | 10 | 10 | 
B   | AA | 10 | 10 | 10 | 
A   | AB | 10 | 10 | 10 | 

私はviewでそれをプリントアウトするとき、私はそれがModelManufacturer名前に基づいて、その後、ソートしたいと思います。結果は次のようになります。マニュファクチャーズの名前は、アルファベット順にソートされ、モデルにソートされます。

Manufacturer | Model | Front | Side | Rear | 
-------------+-------+-------+------+------- 
A   | AA | 10 | 10 | 10 | 
A   | AB | 10 | 10 | 10 | 
A   | AC | 10 | 10 | 10 | 
A   | AD | 10 | 10 | 10 | 
B   | AA | 10 | 10 | 10 | 
B   | AB | 10 | 10 | 10 | 

私はManufacturerModelは、値の明確なペアであることを確認するためにセットアップモデルを持っています。

私はmanufacturer_idmodel_idを使用して参照していますので、私の質問は、私はManufacturerModelテーブルからManufacturerModelの名前を取得する方法、です。

私のtints_controller.rbには、@tints = Tint.all.order(:manufacturer_id)があります。ただし、製造元の名前の代わりにmanufacturer_id(数字のように)に基づいてのみソートされます。

私はRoRモデルでSQLの方法で(SELECT, FROM, WHERE)を実行できることを知っています。しかし、ActiveRecordを使用して名前に基づいてデータをソートすることは可能ですか?

答えて

0

私の質問への回答:tints_controller.rb

を、私はテーブルを結合するために @tints = Tint.joins(:manufacturer, :model).order("manufacturers.name ASC, models.name ASC")を書き、それに応じて注文してください。

上記の@Gostonの回答を試してみましたが、tintsを編集しようとしたときに問題が発生しました。それは私が編集することを許さなかった。

注:@Gostonから提供された回答はそれらを注文しますが、私のケースではedit機能が壊れました。

0

いつでもあなたがRailsの内のエンティティのidは、あなたが簡単に、単純にそのエンティティをインスタンス化することによって、他の関連するフィールドを取得することができます:

@manufacturer = Manufacturer.find(params[manufacturer_id]) 

が、それは他の分野のいずれかを取得することは簡単なことです:

@manufacturer_name = @manufacturer.name 

あなたがメーカーやメーカー名のコレクションが必要な場合(すでに知っているように)、それはスコープのクエリを経由して、すぐに自分でActiveRecord::Relationオブジェクトを構築することをお勧めします。私はあなたの基準が何であるかわからない、そうでなければ、私はいくつかのサンプルコードを提供するだろう。上記の例では

@manufacturers = Manufacturer.where("some_column = ?", some_criterion).order(:sort_field) 

:sort_fieldはあなたのActiveRecord::Relationをソートしたいあなたによってフィールドのようになります。私はあなたのスコープクエリが最後に.order句を含むべきであることを伝えることができます。私はあなたのケースでは、それは:nameだと思います。

このように言われているのは、飾り気のない並べ替えテーブルが必要な場合は、JQuery DataTablesの宝石を調べる必要があります。 DataTablesはあなたのために大変な作業を行うことができます。ユーザーが好きな列を並べ替えることができます。

+0

私はあなたが言っていることを完全に得ていますが、私はいくらか失われています。私は '@ manufacturer.name'を使って製造元の名前を知ることができることを知っています。私が 'Tint'コントローラに入っているので、' @ tints = Tint.all.order(:manufacturer_id) 'を変更することで、次のコードをどのように埋め込むことができますか?私は最後の1時間でそれを理解しようとしていましたが、私はまだ失われています。 –

2

私が正しく理解している場合は、色合い、製造元、モデルの3つのモデルがあります。あなたは適切なhas_manyを所有しており、belongs_to associationsが正しく設定されていると仮定しています。

Tint.rb 
belongs_to :workspace 

Manufacturer.rb 
has_many :models 
has_many :tints, through: :models 

Model.rb: 
belongs_to Manufacturer 
has_many :tints 

あなたは最初に一緒に3つのモデルを結合した後、あなたのすべての色合いレコードを与え、彼らはモデルやメーカーをappropiateますいくつかの基準

tints_controller.rb 
@tints = Tint.joins(model: :manufacturer).order('manufacturers.name, models.name').pluck('manufacturers.name, models.name, tints.front, tints.side, tints.rear') 

によってオーダーする必要があります。あなたのtints_controller.rbで

+0

はい、問題を正しく理解しており、モデルに次の関係があります。しかし、私はSQL結合の使用を避けようとしています。 –

0

@tints = Tint.all.order(:manufacturer_id) 

のinstedad書いてください:

@tints = Tint.all.order(:manufacturer_id, :model_id) 
+0

私はこれを試しましたが、モデルと製造元の名前の代わりにIDだけを並べ替えるので、これはうまくいきません。 –

関連する問題