Sql Rails:多态关联在联接中不包括正确的表别名?
我试图通过:through和:source选项使用两个类似的多态关联进行sql搜索。我所看到的是rails为第一个has\u many:reservation\u trip\u internative\u条目省略了一个表名别名 附加问题:是否可以创建一个新的关联或别名,该关联或别名将返回一个关联,但如果一个关联为空,则恢复为备份?也许这值得再问一个问题 以下是通过TripType和branch ReservationTrip预订的行程条目子项,每个子项都包含一个单独的列表:Sql Rails:多态关联在联接中不包括正确的表别名?,sql,ruby-on-rails,postgresql,polymorphic-associations,Sql,Ruby On Rails,Postgresql,Polymorphic Associations,我试图通过:through和:source选项使用两个类似的多态关联进行sql搜索。我所看到的是rails为第一个has\u many:reservation\u trip\u internative\u条目省略了一个表名别名 附加问题:是否可以创建一个新的关联或别名,该关联或别名将返回一个关联,但如果一个关联为空,则恢复为备份?也许这值得再问一个问题 以下是通过TripType和branch ReservationTrip预订的行程条目子项,每个子项都包含一个单独的列表: class Itin
class ItineraryEntry < ActiveRecord::Base
default_scope order('position ASC')
attr_accessible :title, :code, :datetime, :position, :itinerary_type, :itinerary_id, :action_type, :action_id
belongs_to :itinerary, polymorphic: true
belongs_to :action, polymorphic: true
以下是SQL错误:
PG::Error: ERROR: missing FROM-clause entry for table "reservation_trip_itinerary_entries"
LINE 2: (reservation_trip_itinerary_entries.action_type = ...
^
想法?谢谢 玩了这个之后,我发现ActiveRecord在这里有一个细微差别。它不会将别名分配给原始问题中名为“行程”的第一个关联,但会将别名分配给所有后续关联 因此,我通过如下方式对WHERE子句进行黑客攻击得到了我的查询:
if params.key?(:itinerary_entry) and not params[:itinerary_entry].empty?
includes.push(trip_types: [:itinerary_entries], reservation_trips: [:itinerary_entries])
warez.push("
(itinerary_entries.action_type = '#{params[:itinerary_entry][:action_type]}' AND
itinerary_entries.action_id = #{params[:itinerary_entry][:action_id]}) OR
(itinerary_entries_trip_types.action_type = '#{params[:itinerary_entry][:action_type]}' AND
itinerary_entries_trip_types.action_id = #{params[:itinerary_entry][:action_id]})
")
end
产生了这个查询
SELECT DISTINCT "reservations".id,
reservations.created_at AS alias_0
FROM "reservations"
LEFT OUTER JOIN "reservation_trips"
ON "reservation_trips"."reservation_id" =
"reservations"."id"
LEFT OUTER JOIN "itinerary_entries"
ON "itinerary_entries"."itinerary_id" =
"reservation_trips"."id"
AND "itinerary_entries"."itinerary_type" =
'ReservationTrip'
LEFT OUTER JOIN "reservation_trips" "reservation_trips_reservations_join"
ON "reservation_trips_reservations_join"."reservation_id" =
"reservations"."id"
LEFT OUTER JOIN "trip_types"
ON "trip_types"."id" =
"reservation_trips_reservations_join"."trip_type_id"
LEFT OUTER JOIN "itinerary_entries" "itinerary_entries_trip_types"
ON "itinerary_entries_trip_types"."itinerary_id" =
"trip_types"."id"
AND "itinerary_entries_trip_types"."itinerary_type" =
'TripType'
WHERE ( ( itinerary_entries.action_type = 'Activity'
AND itinerary_entries.action_id = 3 )
OR ( itinerary_entries_trip_types.action_type = 'Activity'
AND itinerary_entries_trip_types.action_id = 3 ) )
ORDER BY reservations.created_at DESC
LIMIT 100
if params.key?(:itinerary_entry) and not params[:itinerary_entry].empty?
includes.push(trip_types: [:itinerary_entries], reservation_trips: [:itinerary_entries])
warez.push("
(itinerary_entries.action_type = '#{params[:itinerary_entry][:action_type]}' AND
itinerary_entries.action_id = #{params[:itinerary_entry][:action_id]}) OR
(itinerary_entries_trip_types.action_type = '#{params[:itinerary_entry][:action_type]}' AND
itinerary_entries_trip_types.action_id = #{params[:itinerary_entry][:action_id]})
")
end
SELECT DISTINCT "reservations".id,
reservations.created_at AS alias_0
FROM "reservations"
LEFT OUTER JOIN "reservation_trips"
ON "reservation_trips"."reservation_id" =
"reservations"."id"
LEFT OUTER JOIN "itinerary_entries"
ON "itinerary_entries"."itinerary_id" =
"reservation_trips"."id"
AND "itinerary_entries"."itinerary_type" =
'ReservationTrip'
LEFT OUTER JOIN "reservation_trips" "reservation_trips_reservations_join"
ON "reservation_trips_reservations_join"."reservation_id" =
"reservations"."id"
LEFT OUTER JOIN "trip_types"
ON "trip_types"."id" =
"reservation_trips_reservations_join"."trip_type_id"
LEFT OUTER JOIN "itinerary_entries" "itinerary_entries_trip_types"
ON "itinerary_entries_trip_types"."itinerary_id" =
"trip_types"."id"
AND "itinerary_entries_trip_types"."itinerary_type" =
'TripType'
WHERE ( ( itinerary_entries.action_type = 'Activity'
AND itinerary_entries.action_id = 3 )
OR ( itinerary_entries_trip_types.action_type = 'Activity'
AND itinerary_entries_trip_types.action_id = 3 ) )
ORDER BY reservations.created_at DESC
LIMIT 100