1

МоделиRails/ActiveRecord: не получение правильного столбца через объединение с has_one/belongs_to отношений

class Feature < ActiveRecord::Base 
    belongs_to :agency_feature 
    ... 
end 

class Agency < ActiveRecord::Base 
    has_many :agency_features, dependent: :destroy 
    ... 
end 

class AgencyFeature < ActiveRecord::Base 
    belongs_to :agency 
    has_one :feature 
end 

Схема

create_table "agency_features", force: true do |t| 
    t.integer "agency_id" 
    t.integer "feature_id" 
    t.boolean "enabled" 
end 

add_index "agency_features", ["agency_id"], name: "index_agency_features_on_agency_id", using: :btree 
add_index "agency_features", ["feature_id"], name: "index_agency_features_on_feature_id", using: :btree 

Проблема

Agency.first.agency_feature дает мне:

<AgencyFeature id: 508, agency_id: 1, feature_id: 1, enabled: false> 

и Agency.first.agency_features.first.agency возвращает правильное агентство.

Проблема заключается в том Agency.first.agency_features.first.feature дает столбца не существует ошибки и пытается искать "agency_feature_id" внутри функций.

Как мне найти функцию с идентификатором, который соответствует атрибуту «feature_id» внутри AgencyFeature?

ответ

1

Может быть, попробуйте запустить миграцию снова. Я согласен с Марнусом здесь. Я думаю, что у вас нет поля agency_feature_id в вашей таблице Feature. Это должно выглядеть примерно так:

create_table "features", force: true do |t| 
    t.integer "agency_feature_id" 
    ... 
end 
1

Заменить has_one :feature с belongs_to :feature

class AgencyFeature < ActiveRecord::Base 
    belongs_to :agency 
    belongs_to :feature 
end 
+0

Я хотел бы сделать это с текущими отношениями, которые должны быть has_one, например [this] (http://guides.rubyonrails.org/association_basics.html#the-has-one-association) – Blinky

+0

I ' Я не уверен, что я следую. С 'has_one: feature', вам нужно будет иметь столбец' agency_feature_id' в таблицах 'features'. Я не думаю, что это то, что вам нужно. Мне кажется, что у вас есть общая таблица соединений, как описано [здесь] (http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association) – Magnuss

1

Я на самом деле понял это, изменив ключевые атрибуты в модели объектов.

class AgencyFeature < ActiveRecord::Base 
    belongs_to :agency 
    has_one :feature, foreign_key: "id", primary_key: "feature_id" 
end 

Теперь я могу использовать отношения has_one, как я и предполагал. Где feature_id соответствует идентификатору функции в таблице функций.