1

私は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

これは、このクエリで使用する 3 つのテーブルの図です。

モデルは次のとおりです。

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それが他の誰かにも役立つことを願っています!

ありがとう。

4

1 に答える 1

1

コンバージョン タイプによるコンバージョンとコミッションの関係がわかりません

追加:

#add to Conversions
has_and_belongs_to_many :comissions, :through => :conversion_type

#add to Comissions
has_and_belongs_to_many :conversions, :through => :conversion_type

クラスごとに

詳細については、 has_many : has_and_belongs_to_many 関連付けを介して参照してください。

于 2012-08-16T18:21:29.857 に答える