我有以下型号:
class Business < ApplicationRecord
has_many :shopping_trips
end
class ShoppingTrip < ApplicationRecord
belongs_to :business
has_many :purchases
end
class Purchase < ApplicationRecord
belongs_to :shopping_trip
end
因此,一个企业可以有很多购物之旅,每个购物之旅都可以有很多购物。
我试图在Purchase表上运行一个简单的查询来查找属于特定业务的购买。所以我写这个:
purchases = Purchase.joins(:shopping_trip => :business ).where(:shopping_trip => {:business_id => 1})
不幸的是它不起作用。我收到以下错误:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "shopping_trip"
LINE 1: ...sses"."id" = "shopping_trips"."business_id" WHERE "shopping_...
^
: SELECT "purchases".* FROM "purchases" INNER JOIN "shopping_trips" ON "shopping_trips"."id" = "purchases"."shopping_trip_id" INNER JOIN "businesses" ON "businesses"."id" = "shopping_trips"."business_id" WHERE "shopping_trip"."business_id" = $1
连接看起来很正确,但where子句似乎失败了。
ActiveRecord :: StatementInvalid:PG :: UndefinedTable:ERROR:缺少表“shopping_trip”的FROM子句条目
您需要在where
中指定表名而不是关联名。所以shopping_trip
应该是shopping_trips
purchases = Purchase.joins(:shopping_trip => :business ).where(:shopping_trips => {:business_id => 1})
更好的解决方案是设置间接关联,以便您可以通过连接模型进行查询而无需手动连接:
class Business < ApplicationRecord
has_many :shopping_trips
has_many :purchases, through: :shopping_trips
end
class ShoppingTrip < ApplicationRecord
belongs_to :business
has_many :purchases
end
class Purchase < ApplicationRecord
belongs_to :shopping_trip
has_one :business, through: :shopping_trip
end
您现在可以从任何一方查询:
@business = Business.eager_load(:purchases).find(1)
@purchases = @business.purchases
# or
@purchases = Purchase.eager_load(:buisness).where(businesses: { id: 1 })
all_purchase = Purchase.all
all_purchase.each do | each_purchase | each_purchase.shopping_trip.business结束