2013-08-08 3 views
0

Моя модель выглядит следующим образом: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». Но ... тогда ... почему я не должен был делать это для смежных_локаций? Это потому, что они были того же класса, что и модель, в которой они находились?

+2

Если честно, я не буду тратить время, пытаясь помочь вам только потому, что вы не следуете соглашениям. Вы используете пользовательские имена внешних ключей, а также не соблюдаете соглашения единственного числа/множественного числа, что делает этот кошмар для отладки. Я не пытаюсь быть грубым, но на самом деле, следуйте соглашениям не только для себя, но и для других, которые смотрят на ваш код. – bluehallu

+0

Я использую пользовательские имена внешнего ключа, потому что у меня есть как элементы, так и ожидаемые элементы? Разве это не правильный способ иметь два набора одного и того же объекта? Я также не уверен, что вы имеете в виду о единственном числе/множественном числе. «item_types» множественное число, как и «местоположения» для таблицы соединений, в то время как их имя модели является единственным? Я изменил его с «ожидаемого» на «е» в миграции, потому что миграция жаловалась на то, что имя таблицы/индекса было слишком длинным. – Jenny

ответ

0

Похоже, мне нужно было «association_foreign_key» вместо «foreign_key» для поля expected_item_types. Кто-нибудь знает, зачем мне это не нужно для поля «смежные_локации»?