转换SQL查询并在模型中的两个表之间创建关联

时间:2014-07-24 14:22:40

标签: ruby-on-rails

我只有2个型号:itemorder,我知道使用这些模型:

Item.count(:all)
Order.count(:all)

但我想做这个查询:(加入2个表但只是条件)

SELECT count(i.id)
FROM somethingitem as i, somethingorder as o
WHERE i.uid = o.uid_order
AND o.cancelled = 0
AND o.cashier = 1
AND o.seller = 0;

或INNER JOIN:

SELECT count(i.id)
FROM somethingitem as i
INNER JOIN somethingorder as o
WHERE i.uid = o.uid_order
AND o.cancelled = 0
AND o.cashier = 1
AND o.seller = 0;

模特:

class Item < ActiveRecord::Base
self.table_name = "somethingitem"
end

class Order < ActiveRecord::Base
self.table_name = "somethingorder"
end

我的桌子没有任何索引或密钥。 (没有主要的外国人)

谢谢。

编辑:目前,我使用Item.count_by_sql(&#34;我的查询&#34;)并且它可以正常工作。

编辑2:好的,要将Activerecord用于现有数据库,我必须在我的2个表之间创建关联,但只能在rails模型中创建,而不是在我的数据库中! belongs_to,has _many或has_one ...我的字段名称没有标准。

Order can have many items.

1 个答案:

答案 0 :(得分:2)

如果在模型中设置正确的关联,

Rails可以轻松实现这一点。如您所述,您的主键/外键不遵循ActiveRecord约定,因此您需要为关联提供更多信息:

class Item < ActiveRecord::Base
  belongs_to :order, foreign_key: 'uid', primary_key: 'uid_order'
end

class Order < ActiveRecord::Base
  has_many :items, foreign_key: 'uid', primary_key: 'uid_order'
end

您现在可以执行此操作:

Item.joins(:order).where(orders: {cancelled: 0, cashier: 1, seller: 0}).count

如果将订单范围放在Order类中(无论如何它更自然地属于它),您可以使此查询更清晰:

class Order
  def self.cashier
    where(cashier: 1, seller: 0)
  end

  def self.non_cancelled
    where(cancelled: 0)
  end
end

现在您可以执行相同的查询:

Item.joins(:order).merge(Order.non_cancelled.cashier).count