привязка has_many к неправильному параметру

#ruby-on-rails #has-many

#ruby-on-rails #имеет-много

Вопрос:

У меня есть show.html.erb :

 <h3>Rooms (<%= @building.rooms.count %>)</h3>
<%= render @rooms %>
  

Я получаю эту ошибку:

 OCIError: ORA-00904: "ROOMS"."BUILDING_ID": invalid identifier: 
SELECT "ROOMS".* FROM "ROOMS" WHERE "ROOMS"."BUILDING_ID" = :a1`
  

Вот модели:

 class Building < ActiveRecord::Base
  has_many :rooms
end

class Room < ActiveRecord::Base
  belongs_to :building
end
  

Вот buildings_controller.rb :

 class BuildingsController < ApplicationController

  def show
    @building = Building.find(params[:id])
    @rooms = @building.rooms.all
  end
  

building Модель имеет атрибуты:

 ID, NAME, CREATED_AT, UPDATED_AT, CODE
  

room Модель имеет атрибуты:

 ID, NAME, CREATED_AT, UPDATED_AT, BUILDING_CODE, NUMBER
  

Комментарии:

1. Какую базу данных вы используете? Оракул? MySQL? PostgreSQL?

2. так что же он должен делать?

3. Отображение всех комнат, принадлежащих определенному зданию, где Building.code = Room.building_code

4. Вместо использования СБОРКИ. ID и ROOM.BUILDING_ID, я бы хотел использовать BUILDING . КОД и ROOM.BUILDING_CODE.

Ответ №1:

вы должны определить явный foreign_key на Room

 class Room < ActiveRecord::Base
  belongs_to :building, foreign_key: :code
end
  

таким образом, вы указываете active record использовать building.code для поиска.

Конечно, вам также понадобится правильная миграция для определения room.building_code

например

 def change
  add_column :rooms, :building_code, :integer # or :string
  add_index :rooms, :building_code
end
  

Ответ №2:

В вашей Room модели измените ассоциацию, чтобы она стала такой:

 class Room < ActiveRecord::Base
  belongs_to :building, primary_key: 'code'
end
  

Это сообщит rails, что первичный ключ ассоциации используется code вместо значения по умолчанию id .