Моя модель выглядит следующим образом:Rails Foreign Key не работает для одного отношения habtm?
class Location < ActiveRecord::Base
attr_accessible :title
has_and_belongs_to_many :adjacent_locations, :class_name => "Location", :foreign_key => "adjacent_location_id", :join_table => "adjacent_locations_locations"
has_many :npcs #who are currently in this location
has_and_belongs_to_many :expected_npcs, :class_name => "Npc" #who do I expect to be here (is it their house?)
has_and_belongs_to_many :items #what do I actually have?
has_and_belongs_to_many :expected_items, :class_name => "Item"
has_and_belongs_to_many :expected_item_types, :class_name => "ItemType", :foreign_key => "e_item_type_id", :join_table => "e_item_types_locations"
end
каждый из этих has_and_belongs_to_many работ, за исключением "expected_item_types".
Он выглядит JUST как соседние местоположения в модели, но не работает.
Мой миграции работает просто отлично, и выглядит точно так же как и другие объединения таблиц, насколько я могу сказать:
class CreateEItemTypesLocationsTable < ActiveRecord::Migration
def self.up
create_table :e_item_types_locations, :id => false do |t|
t.references :e_item_type
t.references :location
end
add_index :e_item_types_locations, [:e_item_type_id, :location_id], :name => "eit_loc"
end
def self.down
drop_table :e_item_types_locations
end
end
Это именованный индекс так же, как expected_items делает, и внешний ключ в модели только как местонахождение делает. Есть ли что-то особенное для установки внешнего ключа с указанным индексом?
Фактическая ошибка, я получаю
SQLite3::SQLException: no such column: e_item_types_locations.item_type_id: SELECT "item_types".* FROM "item_types" INNER JOIN "e_item_types_locations" ON "item_types"."id" = "e_item_types_locations"."item_type_id" WHERE "e_item_types_locations"."e_item_type_id" = 1
Что означает, что это просто не обращая внимания на внешний ключ я поставил ... Есть ли что-то явно не так с этим?
Редактировать: Я думаю, что я понял, по крайней мере, часть его, вместо внешнего ключа, это должно быть «association_foreign_key». Но ... тогда ... почему я не должен был делать это для смежных_локаций? Это потому, что они были того же класса, что и модель, в которой они находились?
Если честно, я не буду тратить время, пытаясь помочь вам только потому, что вы не следуете соглашениям. Вы используете пользовательские имена внешних ключей, а также не соблюдаете соглашения единственного числа/множественного числа, что делает этот кошмар для отладки. Я не пытаюсь быть грубым, но на самом деле, следуйте соглашениям не только для себя, но и для других, которые смотрят на ваш код. – bluehallu
Я использую пользовательские имена внешнего ключа, потому что у меня есть как элементы, так и ожидаемые элементы? Разве это не правильный способ иметь два набора одного и того же объекта? Я также не уверен, что вы имеете в виду о единственном числе/множественном числе. «item_types» множественное число, как и «местоположения» для таблицы соединений, в то время как их имя модели является единственным? Я изменил его с «ожидаемого» на «е» в миграции, потому что миграция жаловалась на то, что имя таблицы/индекса было слишком длинным. – Jenny