0

データベースdishesに3 つのテーブルがprice_dealsあり、give_away_deals

# == Schema Information
#
# Table name: dishes
#
#  id          :integer         not null, primary key
#  name        :string(255)
#  created_at  :datetime
#  updated_at  :datetime

# Table name: price_deals
#
#  id              :integer         not null, primary key
#  name            :string(255)
#  dish_id         :integer
#  created_at      :datetime
#  updated_at      :datetime

# Table name: give_away_deals
#
#  id          :integer         not null, primary key
#  name        :string(255)
#  dish_id     :integer
#  created_at  :datetime
#  updated_at  :datetime

テーブルからidandを取得する必要があります。ID が含まれていない場合と ID が含まれていない場合、IDが重複していません。namedishesprice_dealsgive_away_deals

dishesテーブルid1 から 10 に10 個のレコードがあるとします。

price_deals表にはdish_idがあり2,4,5ます。

give_away_deals表にdish_id1,3,6

期待される結果:

次に、テーブル where areからidandを取得する必要がありますnamedishesid7,8,9,10

このクエリを試したところ、

Dish.all(:select => "id, name", :conditions => ["id not in (select dish_id from price_deals)", "id not in (select dish_id from give_away_deals)"])

ただし、 にないデータのみを返しますprice_deals

上記のクエリの何が問題で、期待される結果を得るにはどうすればよいですか?

これは、Rails サーバーで取得した SQL クエリです。

SELECT id, name FROM "dishes" WHERE (id not in (select dish_id from price_deals))
4

2 に答える 2

1

いくつかのより大きな答えへのOK時間。

このコードを試してください:

first = PriceDeal.select(:dish_id).map(&:dish_id)
second = GiveAwayDeal.select(:dish_id).map(&:dish_id)
Dish.select('id, name').where("id not IN(?)", (first + second).uniq)

良いSQLクエリを生成するはずだと思います

于 2012-04-28T14:19:02.210 に答える
1

このコードを試すことができます

Dish.includes(:price_deal, :give_away_deal).where("price_deals.id is null and give_away_deals.id is null")

メソッドincludeswhere1 つのクエリで連携する

SQL (0.5ms)  SELECT `dishes`.`id` AS t0_r0, `dishes`.`name` AS t0_r1, `dishes`.`created_at` AS t0_r2, `dishes`.`updated_at` AS t0_r3, `price_deals`.`id` AS t1_r0, `price_deals`.`dish_id` AS t1_r1, `price_deals`.`created_at` AS t1_r2, `price_deals`.`updated_at` AS t1_r3, `give_away_deals`.`id` AS t2_r0, `give_away_deals`.`dish_id` AS t2_r1, `give_away_deals`.`created_at` AS t2_r2, `give_away_deals`.`updated_at` AS t2_r3 FROM `dishes` LEFT OUTER JOIN `price_deals` ON `price_deals`.`dish_id` = `dishes`.`id` LEFT OUTER JOIN `give_away_deals` ON `give_away_deals`.`dish_id` = `dishes`.`id` WHERE (price_deals.id is null and give_away_deals.id is null)

Rails 3.2.1 と Ruby 1.9.3 を使用しています

于 2012-04-28T14:39:08.023 に答える