1

Yardımıma ihtiyacım var. Bunu çalışmak için çok aptalca hissediyorum ama gerçekten bunu anlayamıyorum.Has_and_belongs_to_many ve Tek Tablo Kalıtım

Alt model ile başka bir model arasında birleştirme tablosu oluşturmam gerekiyor.

1) Benim izinleri şemasını takip etmek sınıflandırma edilebilir bir kullanıcı Modeli var:

class User < ActiveRecord::Base 

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

end 

2) Ben rol = "Rp" ile Kullanıcıyı alt sınıfların bir Rp daha alt seviyede var ve bu ilişki mekan modeli:

class Rp < User 
    has_and_belongs_to_many :venues 
end 

3) bir mekan modeli var ve Rp modeline bu ilişki:

class Venue < ActiveRecord::Base 
    has_and_belongs_to_many :rps 
end 

4) sırayla katılmak tablo var ve göç:

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 

Bu Rps_Venues veritabanında tablo katılmak bana veriyor. Ben

Venue.first.rps 

ve

Rp.first.venues 

yapabilmek için beklediğiniz, ancak

enter image description here

Ama bunu yaparken, her nasılsa Aktif Kayıtlar bananers gider: Tüm iyidir ve uygun birleştirme tablosunu kapmak yerine, yerine Rp sınıfına, Kullanıcı:

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' 

Herkes biraz yardımcı olabilir mi?

cevap

1

Aaaaaand burada ben yakın olduğunu biliyordum, gidin:

Sadece böyle bir :join_table belirtin:

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 

Şimdi herşey çalışıyor.