父级

时间:2018-09-09 13:54:45

标签: ruby-on-rails rails-activerecord

我有以下型号:

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

因此,企业可以进行多次购物旅行,并且每一次购物旅行都可以进行多次购买。

我正在尝试在“购买”表上运行一个简单查询,以查找属于特定企业的购买。所以我写这个:

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子句似乎失败。

3 个答案:

答案 0 :(得分:1)

  

ActiveRecord :: StatementInvalid:PG :: UndefinedTable:错误:丢失   表“ shopping_trip”的FROM子句条目

您需要在where内指定表名而不是关联名。因此shopping_trip应该是shopping_trips

purchases = Purchase.joins(:shopping_trip => :business ).where(:shopping_trips => {:business_id => 1})

答案 1 :(得分: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 })

答案 2 :(得分:-1)

选中此...

all_purchase = Purchase.all

all_purchase.each做| each_purchase |    each_purchase.shopping_trip.business 结束