【问题标题】:Rails 3 complex SQL update alternativeRails 3 复杂的 SQL 更新替代方案
【发布时间】:2012-08-16 17:53:28
【问题描述】:

我有一个在 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_commissions 是:

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 个查询,我不确定这比我编写一个查询来进行更新更好,但也许你可以帮助我。所以这是我设法编写的选择以获得我需要的转换。

@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))

完美!!! :D 我希望它也对其他人有所帮助!

谢谢。

【问题讨论】:

  • 在我看来这不是一个很复杂的说法,而且我认为没有更多的方法可以做到这一点。
  • 是的,在 Rails 中您很少需要编写 sql 查询...您使用的是 ActiveRecord 模型吗?
  • 请指定您的模型和关系。另外,变量affiliates_comisions是什么?
  • @RGB 是的,我正在使用 ActiveRecord 模型...
  • 您是否有一份用于佣金和一份用于转化?因为如果你这样做了,并且你已经正确地建立了他们的关系,你可以在没有一个 SQL 字符串的情况下得到这个,正如@davidrac 所说,我们需要看到他们来回答你的问题

标签: sql ruby-on-rails ruby ruby-on-rails-3 sql-update


【解决方案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 :through a has_and_belongs_to_many association

【讨论】:

  • 这样,通过Conversion 方法,您可以转到self.commissions.where({}) 并指定您的用户和活动值...相反,您可以执行Conversion.find(1).commissions.where({}) 之类的操作
  • 注意:您可能需要使用与 has_and_belongs_to_many 不同的关系,这里的关键是 :through 选项,它允许您以这种方式进行调用
  • 我明白了......好吧,我会尝试使用这些,看看我是否可以让它工作。
  • 它的自动魔力让代码保持干净...... Rails 中的 SQL 应该是您尝试并尽可能避免使用的东西
  • 我设法使用您的建议进行了选择,因此我可以获得具有所需属性的佣金,但我无法使更新正常工作也许您可以帮助我,这就是我的实际情况需要...我会添加一个新的更新。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多