我只有2个型号:item
和order
,我知道使用这些模型:
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.
答案 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