2012-03-21 5 views
5

Actualmente estoy desarrollando un motor de montaje. Dentro del motor que tengo los dos modelos siguientes:HABTM tablas de enlaces que no toman isolate_namespace value en motor montable

module Ems 
    class Channel < ActiveRecord::Base 
     has_and_belongs_to_many :categories 
    end 
    end 

    module Ems 
    class Category < ActiveRecord::Base 
     has_and_belongs_to_many :channels 
    end 
    end 

Estos son los archivos de migración db:

class CreateEmsChannels < ActiveRecord::Migration 
    def change 
     create_table :ems_channels do |t| 
     t.string :slug 
     t.string :name 

     t.timestamps 
     end 
    end 
    end 

    class CreateEmsCategories < ActiveRecord::Migration 
    def change 
     create_table :ems_categories do |t| 
     t.string :slug 
     t.string :name 
     t.text :strapline 

     t.timestamps 
     end 
    end 
    end 


    class CreateEmsCategoriesChannels < ActiveRecord::Migration 
    def up 
     # Create the association table 
     create_table :ems_categories_channels, :id => false do |t| 
     t.integer :category_id, :null => false 
     t.integer :channel_id, :null => false 
     end 

     # Add table index 
     add_index :ems_categories_channels, [:category_id, :channel_id], :unique => true 
    end 
    end 

El problema comienza cuando intento para recuperar los objetos asociados. A modo de ejemplo, cuando llamo @channel.get :categories me sale el siguiente error:

Mysql2::Error: Table 'ems_development.categories_channels' doesn't exist: 
SELECT `ems_categories`.* 
FROM `ems_categories` 
INNER JOIN `categories_channels` 
ON `ems_categories`.`id` = `categories_channels`.`category_id` 
WHERE `categories_channels`.`channel_id` = 1 

Como se puede ver su falta de valor isolate_namespace en la mesa de enlace, ya que debe buscar la asociación con la tabla ems_categories_channels no categories_channels

¿Alguien tuvo problemas similares o me falta algo?

+0

No lo veo, ¿su motor incluye 'isolate_namespace' o no? módulo Ems motor de la clase

Respuesta

5

Puede establecer explícitamente el nombre de la tabla de combinación (per the documentation).

module Ems 
    class Channel < ActiveRecord::Base 
     has_and_belongs_to_many :categories, :join_table => 'ems_categories_channels' 
    end 
    end 

    module Ems 
    class Category < ActiveRecord::Base 
     has_and_belongs_to_many :channels, :join_table => 'ems_categories_channels' 
    end 
    end 
+0

sí, lo entiendo que sin embargo pensé que debería haber elegido este automáticamente. Debido a que Rails hace tanto en segundo plano, no quiero ningún error de configuración, ya que podrían volver a molestarme. ¿Alguna idea sobre si la tabla de unión debería establecerse manualmente? – luxerama

+1

Normalmente, utiliza la convención de los dos nombres de tablas, ordenados alfabéticamente, con cualquier modelo de conjunto 'table_prefix' y' table_suffix' que envuelve el resultado ([como se indica en la fuente aquí] (https://github.com/rails/ rails/blob/master/activerecord/lib/active_record/associations/builder/has_and_belongs_to_many.rb # L42)). Parece que no se tiene en cuenta la encapsulación de 'módulo' para una tabla de unión como lo hace para los modelos. No va a ser una configuración incorrecta si lo está configurando explícitamente, lo que debe hacer usando ': join_table' o potencialmente los atributos de prefijo/sufijo de modelo. –

Cuestiones relacionadas