#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
.