【问题标题】:Has_and_belongs_to_many and Single Table InheritanceHas_and_belongs_to_many 和单表继承
【发布时间】:2016-07-19 05:17:15
【问题描述】:

我需要一些帮助。我觉得让这个工作很愚蠢,但我真的想不通。

我需要在一个子模型和另一个模型之间建立一个连接表。

1) 我得到了一个用户模型,它可以被子类化以遵循我的权限方案:

class User < ActiveRecord::Base

  # so we can use Single Table inheritance with each role for the platform
  self.inheritance_column = :role

end

2) 我有一个 Rp 子模型,它使用 role = "Rp" 对 User 进行子类化,我将其与 Venue 模型相关联:

class Rp < User
  has_and_belongs_to_many :venues
end

3) 我有一个 Venue 模型,我将它与 Rp 模型联系起来:

class Venue < ActiveRecord::Base
  has_and_belongs_to_many :rps
end

4)我按顺序得到了连接表并迁移:

class CreateJoinTableVenueRp < ActiveRecord::Migration
  def change
    create_join_table :Venues, :Rps do |t|
      t.index [:venue_id, :rp_id]
      t.index [:rp_id, :venue_id]
    end
  end
end

这为我提供了数据库中的 Rps_Venues 连接表。一切都很好:

但是,我希望能够做到

Venue.first.rps

Rp.first.venues

但是当我这样做时,不知何故,Active Records 变得很糟糕并且没有抓住正确的连接表,而是试图将场所与 Rp 超类用户匹配:

Loading development environment (Rails 4.2.5.1)
[1] pry(main)> Venue.first.rps
  Venue Load (0.9ms)  SELECT  "venues".* FROM "venues"  ORDER BY "venues"."id" ASC LIMIT 1
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  **relation "users_venues" does not exist**
LINE 5:                WHERE a.attrelid = '"users_venues"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"users_venues"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum
from /home/null/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'
[2] pry(main)> Rp.first.venues
  Rp Load (1.4ms)  SELECT  "users".* FROM "users" WHERE "users"."role" IN ('Rp')  ORDER BY "users"."id" ASC LIMIT 1
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  **relation "users_venues" does not exist**
LINE 5:                WHERE a.attrelid = '"users_venues"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"users_venues"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum
from /home/null/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'

谁能帮帮忙?

【问题讨论】:

    标签: ruby-on-rails rails-activerecord jointable single-table-inheritance


    【解决方案1】:

    啊啊啊,我们走了,我知道我很接近了:

    只需像这样指定:join_table

    class Rp < User
      has_and_belongs_to_many :venues, join_table: "Rps_Venues"
    end
    
    class Venue < ActiveRecord::Base
      has_and_belongs_to_many :rps, join_table: "Rps_Venues"
    end
    

    现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2010-09-17
      • 2012-03-08
      • 2011-12-20
      • 1970-01-01
      相关资源
      最近更新 更多