I''ve got a left join problem of some sort connecting from linux FreeTDS/ODBC to SQL Server. It''s similar to the false post I had earlier, but this is a real problem. Here''s my code: def find_recipes_for_workorder @recipe_pages, @recipes = paginate_with_sort :recipes, :per_page => 10, \ :joins => ''left join workorder on workorder.workorder_id = recipe.workorder_id'', \ :conditions => ["workorder.name = ?", params[:workorder][:name]] render :template => ''recipe/list'' end (paginate_with_sort at bottom of email.) Here''s the top of the error: Processing RecipeController#find_recipes_for_workorder (for 172.17.1.102 at 2006-01-09 23:26:30) [POST] Parameters: {"workorder"=>{"name"=>"RGL004"}, "action"=>"find_recipes_for_workorder", "controller"=>"recipe"} DBI::DatabaseError ( (8156) [unixODBC][FreeTDS][SQL Server]The column ''name'' was specified multiple times for ''tally''.): /usr/lib/site_ruby/1.8/DBD/ODBC/ODBC.rb:168:in `execute'' /usr/lib/site_ruby/1.8/dbi/dbi.rb:640:in `execute'' /usr/lib/site_ruby/1.8/dbi/dbi.rb:671:in `select_all'' /vendor/rails/activerecord/lib/active_record/connection_adapters/ sqlserver_adapter.rb:354:in `add_limit_offset!'' /vendor/rails/activerecord/lib/active_record/base.rb:931:in `add_limit!'' /vendor/rails/activerecord/lib/active_record/base.rb:924:in `construct_finder_sql'' /vendor/rails/activerecord/lib/active_record/base.rb:395:in `find'' /vendor/rails/actionpack/lib/action_controller/pagination.rb: 174:in `find_collection_for_pagination'' /vendor/rails/actionpack/lib/action_controller/pagination.rb: 192:in `paginator_and_collection_for'' /vendor/rails/actionpack/lib/action_controller/pagination.rb: 124:in `paginate'' /lib/sorting.rb:7:in `paginate_with_sort'' Any ideas appreciated. Thanks, Jamie ------------- class ActionController::Base def paginate_with_sort(collection_id, options={}) @params[:sort_direction] ||= ''-1'' asc_desc = {''1'' => "asc", ''-1'' => "desc"} options[:order] = "#{@params[:sort_by]} #{asc_desc[@params [:sort_direction]]}" if @params[:sort_by] @params[:sort_direction] = @params[:sort_direction].to_i * (-1) paginate collection_id, options end end
Jamie Orchard-Hays
2006-Jan-10 17:06 UTC
[Rails] sql server & linux: left join problem (add_limit_offset!)
It turns out that SQLServerAdaptor''s add_limit_offset has a bug in it. If there is a left join on two tables that have columns with the *same name*, the error below is created. I''ve been able to verify this by taking the generated sql statement and placing it into Query Analyzer. This is the sort of statement generated: SELECT count(*) as TotalRows from (SELECT TOP 1000000000 * FROM recipe left join workorder on workorder.workorder_id = recipe.workorder_id WHERE (workorder.name = ''VMD001'') ) tally recipe and workorder both have "name" as a column, so the query throws the error "DBI::DatabaseError ( (8156) [unixODBC][FreeTDS][SQL Server]The column ''name'' was specified multiple times for ''tally''.):" I''m wondering if anyone has already patched this, but not submitted it to trac. I''ll be digging in and see if I can create a patch for this today. If anyone has anything done already, that would be great. Jamie On Jan 9, 2006, at 11:44 PM, Jamie Orchard-Hays wrote:> I''ve got a left join problem of some sort connecting from linux > FreeTDS/ODBC to SQL Server. It''s similar to the false post I had > earlier, but this is a real problem. Here''s my code: > > def find_recipes_for_workorder > @recipe_pages, @recipes = > paginate_with_sort :recipes, :per_page => 10, \ > :joins => ''left join workorder on workorder.workorder_id = > recipe.workorder_id'', \ > :conditions => ["workorder.name = ?", params[:workorder][:name]] > render :template => ''recipe/list'' > end > > (paginate_with_sort at bottom of email.) > > Here''s the top of the error: > > Processing RecipeController#find_recipes_for_workorder (for > 172.17.1.102 at 2006-01-09 23:26:30) [POST] > Parameters: {"workorder"=>{"name"=>"RGL004"}, > "action"=>"find_recipes_for_workorder", "controller"=>"recipe"} > > > DBI::DatabaseError ( (8156) [unixODBC][FreeTDS][SQL Server]The > column ''name'' was specified multiple times for ''tally''.): > /usr/lib/site_ruby/1.8/DBD/ODBC/ODBC.rb:168:in `execute'' > /usr/lib/site_ruby/1.8/dbi/dbi.rb:640:in `execute'' > /usr/lib/site_ruby/1.8/dbi/dbi.rb:671:in `select_all'' > /vendor/rails/activerecord/lib/active_record/ > connection_adapters/sqlserver_adapter.rb:354:in `add_limit_offset!'' > /vendor/rails/activerecord/lib/active_record/base.rb:931:in > `add_limit!'' > /vendor/rails/activerecord/lib/active_record/base.rb:924:in > `construct_finder_sql'' > /vendor/rails/activerecord/lib/active_record/base.rb:395:in `find'' > /vendor/rails/actionpack/lib/action_controller/pagination.rb: > 174:in `find_collection_for_pagination'' > /vendor/rails/actionpack/lib/action_controller/pagination.rb: > 192:in `paginator_and_collection_for'' > /vendor/rails/actionpack/lib/action_controller/pagination.rb: > 124:in `paginate'' > /lib/sorting.rb:7:in `paginate_with_sort'' > > Any ideas appreciated. > > Thanks, > Jamie > > ------------- > class ActionController::Base > def paginate_with_sort(collection_id, options={}) > @params[:sort_direction] ||= ''-1'' > asc_desc = {''1'' => "asc", ''-1'' => "desc"} > options[:order] = "#{@params[:sort_by]} #{asc_desc[@params > [:sort_direction]]}" if @params[:sort_by] > @params[:sort_direction] = @params[:sort_direction].to_i * (-1) > paginate collection_id, options > end > end > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails