0

したがって、4つの整数列( 、、、、 )を含むテーブル(Aわかりやすくするために呼び出します)があります。これらの4つは、別のテーブルのIDに対応します(例を維持するため)。slot1slot2slot3slot4B

の対応する行からデータをプルする必要がありますBが、ここで問題が発生しました。私は次のwhere()ような方法で4つのスロットをフェッチしようとしています:

@a_item = A.where("publish_at <= ?", DateTime.now).last
@slots = B.where(:id => [@a_item.slot1, @a_item.slot2, @a_item.slot3, @a_item.slot4]) if @a_item != nil

しかし、もちろん、スロットの順序は私が返したものでは維持されません。それはBオブジェクトのIDでソートされます。

したがって、これを行うための1つの汚い方法は、4つのアイテムすべてを個別にフェッチすることですが、これを行う前に、これを行う、または潜在的に関係を構造化するためのより良い方法はありますか?

ありがとう!

4

1 に答える 1

1
@a_item = A.order(:published_at).last
ids = [@a_item.slot1, @a_item.slot2, @a_item.slot3, @a_item.slot4] unless @a_item.nil?
@slots = B.find(ids) unless ids.nil?
results = ids.map { |id| @slots.detect { |slot| slot.id == id } }

何かを期待する場所に何も返されない場合に備えて、残りの復元力チェックとフェイルセーフを追加します。

于 2012-11-27T03:24:48.210 に答える