1

オートマチックではないすべての車両を検索したい。私の車両モデルには、自動の場合は true、手動の場合は false を返すメソッド auto があります。Railsコンソールで、手動のすべての車両のリストを返すにはどうすればよいですか? 以下は機能しません:

vehicles = Vehicle.find(:all);

manual_vehicles = vehicles.Where(auto.present? != true);

models/vehicle.rb

def auto
  Auto.where(:vehicle_id=>self.id)
end
4

2 に答える 2

1

私の車両モデルには、自動の場合は true、手動の場合は false を返すメソッド auto があります。

vehicle_idこれは false です。次のメソッドは、属性が Vehicle と等しいすべての Auto を含む ActiveRecord::Relation を返しますid

def auto
  Auto.where(:vehicle_id=>self.id)
end

Vehicle に Auto が関連付けられているかどうかをテストするコードが必要な場合は、次を使用します。

def auto?
  Auto.where(vehicle_id: self.id).present? # returns TRUE or FALSE
end

次に、手動のすべての車両取得する場合:

Vehicle.all.select{|vehicle| vehicle.auto? != true }

または DB レベルで (より速く、より良く、より強力に!):

Vehicle.where('id NOT IN (?)', Auto.pluck(:vehicle_id).uniq.compact)
# This will get all vehicles where there id is not contained in the Auto table
于 2013-06-10T15:15:58.280 に答える
1
Vehicle.all.select(&:auto?)

多数の車両がある場合、すべての車両が ruby​​ にロードされるため、これは遅いことに注意してください。したがって、SQL でテストを行う方が効率的です。たとえば、#auto?メソッドがautoブール値フィールドのみを参照する場合は、代わりに次のようにすることができます。

Vehicle.where(auto: true)

Relationこれには、結果をではなくとして取得できるという利点もありArrayます。これにより、データベースを呼び出す前に、ダウンストリームでステートメントをさらに絞り込むことができます。

于 2013-06-10T14:45:14.993 に答える