Mysql2 :: Ошибка: неизвестный столбец с таблицей msql на иностранном языке - PullRequest
0 голосов
/ 05 декабря 2018

Я создал приложение rails, которое подключено к базе данных mysql, которая в качестве имен таблиц и столбцов на испанском языке.Я создал модели, представляющие таблицы с английскими именами, и поместил в каждую модель self.table_name = "table_name_in_spanish", чтобы преобразовать таблицу в имя модели, чтобы соглашение Rails не нарушалось.Имея это в виду, у меня есть модель Ad и модель AdCopy, которая содержит несколько описаний для модели Ad.Когда я хочу получить список этих описаний для одного объявления, я делаю следующее внутри rails c:

Сначала я назначаю объявление переменной:

pry(main)> ad = Ad.last
  Ad Load (0.4ms)  SELECT  `anuncios`.* FROM `anuncios` ORDER BY `anuncios`.`id` DESC LIMIT 1
=> #<Ad:0x00007ff8dc45e2f0
 id: 1241,
 empresa: "Example Ad",
 tel: "555 555 555",
 [...]

Затем пытаюсь получить доступ крекламные копии (описания принадлежат объявлению):

pry(main)> ad.ad_copies
  AdCopy Load (1.5ms)  SELECT `anuncios_textos`.* FROM `anuncios_textos` WHERE `anuncios_textos`.`ad_id` = 1241
  AdCopy Load (1.3ms)  SELECT  `anuncios_textos`.* FROM `anuncios_textos` WHERE `anuncios_textos`.`ad_id` = 1241 LIMIT 11
=> #<AdCopy::ActiveRecord_Associations_CollectionProxy:0x3ffc6d8fc498>

То, что я здесь получаю, уже смущает меня, потому что я не знаю, что такое ActiveRecord_Associations_CollectionProxy.

Итак, последний шагэто попытаться получить первое описание, чтобы показать:

pry(main)> ad.ad_copies.first
  AdCopy Load (1.3ms)  SELECT  `anuncios_textos`.* FROM `anuncios_textos` WHERE `anuncios_textos`.`ad_id` = 1241 ORDER BY `anuncios_textos`.`id_anuncio` ASC LIMIT 1
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'anuncios_textos.ad_id' in 'where clause': SELECT  `anuncios_textos`.* FROM `anuncios_textos` WHERE `anuncios_textos`.`ad_id` = 1241 ORDER BY `anuncios_textos`.`id_anuncio` ASC LIMIT 1
from /Users/okmantis/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/mysql2-0.4.10/lib/mysql2/client.rb:120:in `_query'

И вот, где возникает проблема.Как я могу получить доступ к описаниям, относящимся к моему объявлению?

Вот мои модели:

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

class AdCopy < ApplicationRecord
  self.table_name = "anuncios_textos"
  self.primary_key = "id_anuncio"
  belongs_to :ad, foreign_key: "id_anuncio", optional: true
  belongs_to :language, foreign_key: "id_idioma", optional: true
end

И таблица схем для модели Ad (испанский: anuncios):

create_table "anuncios", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=utf8", force: :cascade 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

И таблица схем для модели AdCopy (испанский: anuncios_textos):

create_table "anuncios_textos", primary_key: ["id_anuncio", "id_idioma"], options: "ENGINE=MyISAM DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.integer "id_anuncio", null: false
    t.integer "id_idioma", null: false
    t.text "descripcion", null: false
  end

1 Ответ

0 голосов
/ 08 декабря 2018

Я нашел ответ.Я забыл установить внешний ключ в модели объявления на id_anuncio.Если вы не указали rails явно, что имя столбца внешнего ключа отличается, то он просто вызовет его по имени модели + id: ad_id.Вы можете увидеть это в ошибке внутри консоли: WHERE anuncios_textos.ad_id.

Моя модель объявления должна иметь следующее значение:

class Ad < ApplicationRecord
  self.table_name = "anuncios"
  has_many :ad_copies, foreign_key: 'id_anuncio'
  [...]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...