【问题标题】:complex query... how to join many classes in rails?复杂查询...如何在 Rails 中加入许多类?
【发布时间】:2013-08-21 14:55:37
【问题描述】:

我有以下关联:

class Venue < ActiveRecord::Base
  has_many :sales
end

class Sale < ActiveRecord::Base
  has_many :sale_lines
  has_many :beverages, through: :sale_lines
end

class SaleLine < ActiveRecord::Base
  belongs_to :sale
  belongs_to :beverage
end

class Beverage < ActiveRecord::Base
  has_many :sale_lines
  has_many :sales, through: :sale_lines

  has_many :recipes
  has_many :products, through: :recipes
end

class Recipe < ActiveRecord::Base
  belongs_to :beverage
  belongs_to :product
end

class Product < ActiveRecord::Base
  has_many :recipes
  has_many :beverages, through: :recipes
end

我不想看到每个场地销售的产品数量,所以基本上我必须将recipe.quantity乘以特定产品的sale_line.quantity

我想致电@venue.calc_sales(product) 询问product 的销量。

Venue 类中,我试图通过以下方式计算它:

class Venue < ActiveRecord::Base
  has_many :sales
  def calc_sales(product)
    sales.joins(:sale_lines, :beverages, :recipes).where('recipes.product_id = ?', product.id).sum('sale_lines.quantity * recipe.quantity')
    end
  end

但是,我无法以这种方式访问​​recipes

你知道如何实现它吗?

【问题讨论】:

  • 尝试使用sales.joins(:sales =&gt; { :beverages =&gt; :recipes })
  • @MrYoshiji sales.joins(:sale_lines =&gt; { :beverage =&gt; :recipes }) 成功了。我不太了解复数的规则,但它是这样工作的。只需将您的评论作为答案,我会接受它;)谢谢

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-4


【解决方案1】:

对于连接,您必须使用哈希来连接已连接的表。这很难解释,但这里有一些例子:

  • Venue.joins(:sales, :beverages) :这意味着关系 :sales:beverages 在 Venue 模型上声明。

  • Venue.joins(:sales =&gt; :beverages) :这意味着关系 :sales 存在于 Venue 模型中,而关系 :beverages 存在于 Sale 模型中。


考虑一下:

Venue
  has_one :sale
  • Venue.joins(:sales) :这不会工作,您必须使用与 Venue 模型和 Sale 模型之间的关系完全相同的名称。

  • Venue.joins(:sale) :这会起作用,因为您使用了相同的关系名称。

注意:必须在where子句中使用复数名称:

Venue.joins(:sale).where(:sales => { :id => sale.id })
                ^^           ^^ # See the plural

就你而言,你可以这样做:

sales.joins(:sale_lines => { :beverage => :recipes })
     .where(:recipes => { :product_id => product.id })
     .sum('sale_lines.quantity * recipes.quantity')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2017-12-29
    • 2013-05-22
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多