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

Ruby on rails 转换SQL查询并在模型中的两个表之间创建关联,ruby-on-rails,Ruby On Rails,我只有两种型号:item和order,我知道这样使用这些型号: Item.count(:all) Order.count(:all) 但是我想做这个查询:(连接两个表,但只针对条件) 或具有内部连接: 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.sell

我只有两种型号:
item
order
,我知道这样使用这些型号:

Item.count(:all)
Order.count(:all)
但是我想做这个查询:(连接两个表,但只针对条件)

或具有内部连接:

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
class项
我的表没有任何索引或键。(无初级或外国)

多谢各位

编辑:目前,我使用Item.count\u by\u sql(“我的查询”),它可以正常工作

编辑2:好的,要在现有数据库中使用Activerecord,我必须在我的两个表之间创建关联,但只是在rails模型中,而不是在我的数据库中!属于,有很多或只有一个。。。我的字段名没有rails标准


订单可以包含许多项目。

如果您在模型中设置了正确的关联,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
如果将order范围放入order类中(无论如何,它更自然地属于该类),则可以使该查询更清晰:

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

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

查询看起来不错,但在我的类中,我有
self.table\u name=“somethingorder”
self.table\u name=“somethingorder”
未知列的顺序。在“where子句”中取消了:
我的表是
somethingorder
不是
顺序
。是的,这很困难,但我的数据库有>400万行,我无法建立一个新的结构。我希望我的rails应用程序在迁移时能够工作。
Item.joins(:order).where(“somethingorder”=>{cancelled:0,cashier:1,seller:0})。count
工作正常,但是为什么where子句没有得到
:receive
…@Alexis\u用户
where
子句参数需要遵循SQL语法(包括您案例中的实际表名)以允许ActiveRecord很难识别的更具创造性的查询。您可以将此逻辑作为作用域/类方法进行排序,如果希望避免此情况,可以将该方法合并到查询中(更新以演示此情况)。希望有一天,ActiveRecord能够足够聪明地自行处理此问题…非常感谢PinnyM,我将尝试您的解决方案。但我认为我找到了另一个解决方案
Item.joins(:order)。其中(order.table_name:{取消:0,出纳:1,卖家:0}).count
.Order.table\u name将始终返回表的名称,即使我没有将``self.table\u name=“real\u name”`放入Order类中。但是您的解决方案似乎更好!!
Item.joins(:order).where(orders: {cancelled: 0, cashier: 1, seller: 0}).count
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