Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails:多态关联在联接中不包括正确的表别名?_Sql_Ruby On Rails_Postgresql_Polymorphic Associations - Fatal编程技术网

Sql Rails:多态关联在联接中不包括正确的表别名?

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

我试图通过:through和:source选项使用两个类似的多态关联进行sql搜索。我所看到的是rails为第一个has\u many:reservation\u trip\u internative\u条目省略了一个表名别名

附加问题:是否可以创建一个新的关联或别名,该关联或别名将返回一个关联,但如果一个关联为空,则恢复为备份?也许这值得再问一个问题

以下是通过TripType和branch ReservationTrip预订的行程条目子项,每个子项都包含一个单独的列表:

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