私は2つのテーブルで実行するSQLを持っています:
affiliates_comisions.each do |aff|
connection.update("
UPDATE comissions AS coms,
conversions AS conve
SET conve.active=0
WHERE coms.conversion_type_id=conve.conversion_type_id
AND conve.user_id="+aff.id.to_s+"
AND conve.active=1
AND coms.method = 'one_time'")
end
私の質問は、もしあればどうすればこれをより良い方法で作ることができますか? 別のテーブルの条件が真である必要があるフィールドを更新する方法が見つかりませんでした...
他の詳細が必要な場合はお知らせください。
更新 1
affiliates_comissions は次のとおりです。
total_pay_sql = "(SELECT SUM(payment)
FROM comissions AS coms,conversions AS conve
WHERE coms.conversion_type_id=conve.conversion_type_id
AND conve.user_id=usr.id
AND conve.active=1)"
affiliates_comisions = self.
select('*,'+total_pay_sql+' AS total_pay').
from("users AS usr").
where(total_pay_sql+">=5")
更新 2
モデルは次のとおりです。
class Comission < ActiveRecord::Base
belongs_to :conversion_type
attr_accessible :method, :payment
validates_inclusion_of :method, :in => [:recurring, :one_time]
...
class Conversion < ActiveRecord::Base
attr_accessible :conversion_type_id, :restaurant_id, :user_id, :active
belongs_to :user
belongs_to :restaurant
belongs_to :conversion_type
...
class ConversionType < ActiveRecord::Base
attr_accessible :name
has_many :conversions
end
アップデート 3
@RGBによる提案の後、いくつかの変更を加えて追加しました:
#To conversion model#
has_many :comissions, :through => :conversion_type
#To comission model#
has_many :conversions, :through => :conversion_type
#To conversion_type model#
has_many :conversions
has_many :comissions
そして今、私はこれが2つのクエリを実行するタフな選択でも動作するように管理しました.更新を行うために1つのクエリを書くよりもこれがどのように優れているかはわかりませんが、多分あなたは私を助けることができます. だから、これは私が必要な変換を得るために私が書くことができた選択です。
@conversions = Comission.find_by_method('one_time').conversions.find_all_by_active_and_user_id(1,affiliates_comisions.collect(&:id))
問題は、これで更新を実行できないことです。または、この選択を実行せずに更新クエリを作成するにはどうすればよいですか? ...
答え
私は最終的に、私が望んでいたように物事を機能させることができました。これが私がいくつかの変更を加えた後のものです:
total_pay_sql = "(SELECT SUM(payment)
FROM comissions AS coms,conversions AS conve
WHERE coms.conversion_type_id=conve.conversion_type_id
AND conve.user_id=usr.id
AND conve.active=1)"
affiliates_comisions = self.
select('*,'+total_pay_sql+' AS total_pay').
from("users AS usr").
where(total_pay_sql+">=?",@@minimum_pay)
#we run a normal update here to set the one time conversions to active=0 so we only pay for them once
@conversions = Comission.where({:method=>'one_time'}).joins(:conversions).where("active=1 AND user_id IN(?)",affiliates_comisions.collect(&:id)).update_all(:active=>0)
この最後の行は、私が望んでいた答えであり、@RGB が私が何とかそれを機能させることができたと言ったものと組み合わせています。これは、最後の行で実行されるクエリです。
UPDATE `comissions` INNER JOIN `conversion_types` ON `conversion_types`.`id` = `comissions`.`conversion_type_id` INNER JOIN `conversions` ON `conversions`.`conversion_type_id` = `conversion_types`.`id` SET `active` = 0 WHERE `comissions`.`method` = 'one_time' AND (active=1 AND user_id IN(41))
完全!!!:DIそれが他の誰かにも役立つことを願っています!
ありがとう。