Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

The postgres connection adaptor does not correctly identify Primary Keys in Views and Inherited Tables

#6032

 UnitCurrentAttribute.where(UnitCurrentAttribute.arel_table[:id].eq(5))
 NoMethodError: undefined method `eq' for nil:NilClass


ruby-1.9.2-head > UnitCurrentAttribute.arel_table
#<Arel::Table:0xb146080 @name="unit_attributes_closest_now", @engine=ActiveRecord::Base, @columns=nil, @aliases=[], @table_alias=nil, @primary_key=nil, @table_exists=false>

ruby-1.9.2-head > Unit.all.map(&:property)
[
    [0] #<UnitCurrentAttribute:0xb0875cc> {
                    :id => 1,
               :unit_id => "00400002",
               :name_id => "21fc433eab7b0f0298d6e164cbdd2052",
         :short_name_id => "d5d1fe8583fa57c3fe30753f49452321",
        :description_id => "bcaecf06473d29d72fe0a2d03f6cbc3d",
            :valid_from => Wed, 03 Nov 2010,
              :valid_to => Thu, 03 Nov 2011,
            :created_at => Wed, 03 Nov 2010 13:05:19 UTC +00:00,
            :updated_at => Wed, 03 Nov 2010 13:05:19 UTC +00:00
    }
]

Reported by Robert Pankowecki · November 22nd, 2010 @ 01:16 PM

State: stale
Milestone: none
Assigned to: nobody
Importance: none

Activity

  1. rails
    rails
    • State changed from new to open

    This issue has been automatically marked as stale because it has not been commented on for at least three months.

    The resources of the Rails core team are limited, and so we are asking for your help. If you can still reproduce this error on the 3-0-stable branch or on master, please reply with all of the information you have about it and add "[state:open]" to your comment. This will reopen the ticket for review. Likewise, if you feel that this is a very important feature for Rails to include, please reply with your explanation so we can consider it.

    Thank you for all your contributions, and we hope you will understand this step to focus our efforts where they are most helpful.

    February 23rd, 2011 @ 12:00 AM

  2. rails
    rails
    • State changed from open to stale

    February 23rd, 2011 @ 12:00 AM

  3. johno
    johno

    I've had this same problem with updatable views and managed to find out why.

    .arel_table returns nil on primary_key (since view has no primary key definition), furthermore table_exists? returns false for views. Here is my workaround.

    module UpdatableView
      def arel_table
        @arel_table ||= Arel::UpdatableView.new(table_name, arel_engine)
      end
    end
    
    # AREL MEGAHACK
    # assume id as primary key
    class Arel::UpdatableView < Arel::Table
      def primary_key
        @primary_key ||= self[:id]
      end
    
      def table_exists?
        true
      end
    end
    

    Then use this in your view like this

    class MyView < Activerecord::Base
      extend UpdatableView
    end
    

    March 9th, 2011 @ 01:34 AM

  4. bingbing
  5. omarqureshi
    omarqureshi

    This is also a problem if you are using inherited tables. Although in that case, you can get by, through using set_primary_key "id", for views however, it doesn't look like it works so well here.

    I'm going to take some time over the weekend in order to get the arel table definition to properly recognize primary keys for views and inherited tables

    April 12th, 2011 @ 03:14 PM

  6. omarqureshi
    omarqureshi
    • Tag changed from database views, arel, arel2, postgresql to database views, activerecord, arel, arel2, postgresql

    Problem method found:

      def primary_key(table)
        row = exec_query(<<-end_sql, 'SCHEMA', [[nil, table]]).rows.first
          SELECT DISTINCT(attr.attname)
          FROM pg_attribute  attr,
               pg_depend     dep,
               pg_namespace  name,
               pg_constraint cons
          WHERE attr.attrelid     = dep.refobjid
            AND attr.attnum       = dep.refobjsubid
            AND attr.attrelid     = cons.conrelid
            AND attr.attnum       = cons.conkey[1]
            AND cons.contype      = 'p'
            AND dep.refobjid      = $1::regclass
        end_sql
    
        row && row.first
      end
    

    as part of https://github.com/rails/rails/raw/master/activerecord/lib/active_r...

    called by Arel by @engine.connection.primary_key(name)

    April 17th, 2011 @ 03:53 PM

  7. omarqureshi
    omarqureshi
    • Tag changed from database views, activerecord, arel, arel2, postgresql to database views, activerecord, arel, arel2, postgres-inherited-tables, postgresql

    April 17th, 2011 @ 03:55 PM

  8. omarqureshi
    omarqureshi
    • Title changed from Arel 2 does not work well with views on postgresql to The postgres connection adaptor does not correctly identify Primary Keys in Views and Inherited Tables

    April 17th, 2011 @ 03:56 PM

  9. omarqureshi
    omarqureshi

    I wonder if instead of the primary key fix being applied here, it should be applied closer to the adaptor - as in something like

    (row && row.first) || "id"
    

    with it yielding way if set_primary_key was used in the class?

    April 17th, 2011 @ 04:09 PM