【问题标题】:Rails/ActiveRecord: not retrieving the correct column through a join with a has_one/ belongs_to relationshipRails/ActiveRecord:没有通过具有 has_one/belongs_to 关系的连接检索正确的列
【发布时间】:2015-10-18 21:07:00
【问题描述】:

模型

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"

如何让它查找 ID 与 AgencyFeature 内的“feature_id”属性相对应的功能?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rails-activerecord rails-migrations


    【解决方案1】:

    也许尝试再次运行迁移。我同意马努斯的观点。我认为您的 Feature 表中没有 agent_feature_id 字段。它应该看起来像 -

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

    【讨论】:

      【解决方案2】:

      has_one :feature替换为belongs_to :feature

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

      【讨论】:

      • 我想用当前的关系做这个,应该是has_one,比如this
      • 我不确定我是否遵循。使用has_one :feature,您需要在表features 中有列agency_feature_id。我不认为那是你需要的。在我看来,您有一个通用连接表,如 here 所述
      【解决方案3】:

      我实际上是通过更改特征模型中的关键属性来解决这个问题的。

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

      现在我可以按照我的意图使用 has_one 关系了。其中feature_id对应特征表中特征的id。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多