Использование английских моделей с испанской базой данных в Rails

0

Я только что связал приложение Rails с базой данных mysql, которая имеет имена таблиц и столбцы на испанском языке. Теперь я решил проблему имен таблиц в испанском языке, установив self.table_name = "table_name" внутри model.rb. Теперь следующая проблема возникает, когда я хочу вызывать данные посредством объединения таблиц. В этом случае я пытаюсь назвать все ads, принадлежащие первой category. Когда я попробую это, как вы видите на скриншоте ниже, я получаю эту ошибку. Он видит в таблице ad anuncio которая является испанским именем. Я немного смущен, потому что я думал, что, делая self.table_name = "table_name" в каждой модели, Rails знает, какую таблицу я имею в виду. Кто-нибудь знает, что происходит здесь и как его решить? См. Ниже весь мой код относительно моделей и таблиц.

Изображение 174551

Модель объявления:

class Ad < ApplicationRecord
  self.table_name = "anuncios"
  has_many :ad_copies
  has_many :ad_addresses
  has_many :relationships
  has_many :magazines
  has_many :categories, through: :relationships
  belongs_to :user
end

Модель отношений:

class Relationship < ApplicationRecord
  self.table_name = "rel_anuncio"
  self.primary_key = "id_anuncio"
  belongs_to :ad, class_name: "anuncio", foreign_key: "id_anuncio", optional: true
  belongs_to :category, class_name: "categoria", foreign_key: "id_categoria", optional: true
  belongs_to :subcategory, class_name: "subcategoria", foreign_key: "id_subcategoria", optional: true
end

Модель категории:

class Category < ApplicationRecord
  self.table_name = "categorias"
  has_many :subcategories
  has_many :relationships
  has_many :ads, through: :relationships
  belongs_to :user
end

Модель подкатегории:

class Subcategory < ApplicationRecord
  self.table_name = "subcategorias"
  has_many :relationships
  has_many :ads, through: :relationships
  belongs_to :category
end

Вы можете видеть в вышеприведенных моделях, что я пытаюсь подключить модель отношений к модели объявления, соответственно, к категории и подкатегории, потому что эти модели имеют отношение n: n друг к другу. Раньше, когда я использовал английскую базу данных как практику, работала @categories.first.ads.count, но, перейдя на испанскую базу данных, она внезапно перестала работать. В таблице отношений я также явно устанавливаю внешний ключ для каждой из моделей.

Схема таблицы объявлений (anuncios):

create_table "anuncios", id: :integer, force: :cascade, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" do |t|
    t.string "empresa", null: false
    t.string "tel", null: false
    t.string "fax_principal", null: false
    t.string "movil_principal", null: false
    t.string "email_principal", null: false
    t.string "web", null: false
    t.string "facebook", null: false
    t.string "horario_v_principal", null: false
    t.string "horario_i_principal", null: false
    t.string "direccion_principal", null: false
    t.string "poblacion_principal", null: false
    t.string "activo", limit: 2, null: false
    t.string "tam_anuncio", null: false
    t.string "twitter", null: false
    t.string "link", limit: 2, null: false
    t.string "general", limit: 2, null: false
    t.string "isla", limit: 10, null: false
    t.string "subtitulo", null: false
    t.string "comentario", null: false
    t.datetime "modificacion", null: false
    t.integer "promo1", default: 0, null: false
    t.integer "promo2", default: 0, null: false
    t.string "instagram", null: false
    t.string "tel2", null: false
    t.string "tel3", null: false
    t.string "tel4", null: false
    t.string "movil2", null: false
    t.string "movil3", null: false
    t.string "movil4", null: false
  end

Схема таблицы отношений (rel_anuncios):

create_table "rel_anuncio", primary_key: ["id_anuncio", "id_categoria", "id_subcategoria"], force: :cascade, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" do |t|
    t.integer "id_anuncio", null: false
    t.integer "id_categoria", null: false
    t.integer "id_subcategoria", null: false
    t.integer "orden", null: false
  end

Схема категорий категорий (категорий):

create_table "categorias", id: :integer, force: :cascade, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" do |t|
    t.string "nombre", null: false
    t.string "color", null: false
    t.string "activo", limit: 2, null: false
    t.string "bdd", limit: 7, null: false
    t.integer "orden", null: false
    t.integer "promoI", limit: 1, default: 0, null: false
    t.integer "promoF", limit: 1, default: 0, null: false
    t.integer "islas", limit: 1, default: 3, null: false
  end

Таблица подкатегорий (подкатегории):

create_table "subcategorias", id: :integer, force: :cascade, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8" do |t|
    t.integer "id_categoria", null: false
    t.string "nombre", null: false
    t.string "color", null: false
    t.string "activo", limit: 2, default: "si", null: false
    t.integer "orden", null: false
    t.integer "promoI", limit: 1, default: 0, null: false
    t.integer "promoF", limit: 1, default: 0, null: false
    t.integer "islas", limit: 1, default: 3, null: false
  end

ОБНОВИТЬ:

В ответ на комментарий @Jagdeep Singh я изменил relationship.rb чтобы выглядеть так:

class Relationship < ApplicationRecord
  self.table_name = "rel_anuncio"
  self.primary_key = "id_anuncio"
  belongs_to :ad, foreign_key: "id_anuncio", optional: true
  belongs_to :category, foreign_key: "id_categoria", optional: true
  belongs_to :subcategory, foreign_key: "id_subcategoria", optional: true
end

* Я убрал имена классов.

После этого изменения возникает следующая ошибка:

Mysql2::Error: Unknown column 'rel_anuncio.category_id' in 'where clause': SELECT COUNT(*) FROM 'anuncios' INNER JOIN 'rel_anuncio' ON 'anuncios'.'id' = 'rel_anuncio'.'id_anuncio' WHERE 'rel_anuncio'.'category_id' = 1

Здесь я вижу, что ActiveRecord использует в своей sql-инструкции category_id которая должна быть id_categoria (см. Таблицу отношений схемы выше). Я не знаю, как заставить ActiveRecord использовать правильное имя для foreign_key.

Теги:
activerecord

1 ответ

3
Лучший ответ

При определении ассоциаций имена классов должны быть фактическими именами моделей (а не именами их таблиц). И как ваши имена ассоциации следуют Рельсы конвенции, например модель для belongs_to :ad является Ad, и так далее, вы можете опустить с указанием class_name:

class Relationship < ApplicationRecord
  belongs_to :ad, foreign_key: "id_anuncio", optional: true
  belongs_to :category, foreign_key: "id_categoria", optional: true
  belongs_to :subcategory, foreign_key: "id_subcategoria", optional: true
end

Обновить

Дополнительные изменения в определениях объединений после недавней ошибки, размещенной в комментариях:

class Category < ApplicationRecord
  has_many :subcategories, foreign_key: 'id_categoria'
  has_many :relationships, foreign_key: 'id_categoria'
  has_many :ads, through: :relationships
  belongs_to :user
end

class Subcategory < ApplicationRecord
  has_many :relationships, foreign_key: 'id_subcategoria'
  has_many :ads, through: :relationships
  belongs_to :category, foreign_key: 'id_categoria'
end
  • 0
    Хорошо, спасибо @Jagdeep Singh. Я удалил имена классов. Теперь я получаю следующую ошибку на странице: Mysql2::Error: Unknown column 'rel_anuncio.category_id' in 'where clause': SELECT COUNT(*) FROM `anuncios` INNER JOIN `rel_anuncio` ON `anuncios`.`id` = `rel_anuncio`.`id_anuncio` WHERE `rel_anuncio`.`category_id` = 1
  • 0
    Спасибо, Jagdeep, это сработало. Вы решили загадку.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню