为什么两个相同的关联之一 returns 在视图中出现错误(尽管关联在控制台中有效)?

Why one of two identical associations returns an error in view (association works in console though)?

我为 2 个模型创建了一个关联 has_many:专业人士和城市。它们通过连接模型(和 table)链接。我在 rails 控制台中测试了关联,它确实 return 正确的值。当我尝试在索引页上列出所有连接时出现问题。协会城市 <> 连接有效,但专业 <> 连接无效。以下是相关的片段或代码以及我遇到的错误。

Professional.rb:

has_many :feature_connections
has_many :citycodes, :through => :feature_connections

Citycode.rb:

has_many :feature_connections
has_many :professionals, :through => :feature_connections

FeatureConnection.rb:

belongs_to :citycode
belongs_to :professional

Schema.rb:

...
create_table "feature_connections", force: :cascade do |t|
    t.integer  "professional_id"
    t.integer  "citycode_id"
...
create_table "professionals", force: :cascade do |t|
    t.string   "org_name"
...
create_table "citycodes", force: :cascade do |t|
    t.string   "cityname"
...

Index.html.haml(用于列出连接):

      - @feature_connections.each do |c|
        %tr
          %td= c.citycode.cityname
          %td= c.professional.org_name

现在我在尝试访问索引视图时遇到的错误:

undefined method `org_name' for nil:NilClass

更令人困惑的是它几天前就起作用了。我将它推送到 Heroku,它仍然可以在那里工作,但不能在本地工作。

我发现这些设置可能会影响关联,但更改开发不会影响任何东西:

development.rb:

config.eager_load = false

production.rb:

config.eager_load = true

非常感谢对此问题的任何建议、想法和编辑,谢谢!

那只是因为您的 feature_connections 之一没有关联的 professional 记录。可能是不小心删了

您应该找到这个 feature_connection 并将其删除。或者如果允许空关联,您应该在尝试获取它之前检查它在视图中的存在 org_name:

  # index.html.haml
  - @feature_connections.each do |c|
    %tr
      %td= c.citycode.cityname if c.citycode
      %td= c.professional.org_name if c.professional

或使用try方法:

  # index.html.haml
  - @feature_connections.each do |c|
    %tr
      %td= c.citycode.try(:cityname)
      %td= c.professional.try(:org_name)

如果不允许空关联,以后应该避免这个问题,添加一些验证和约束:

模型层面:

# feature_connection.rb:
validate :citycode, :professional, presence: true

## You might also want to delete join table reords when delete an object:

# professional.rb:
has_many :feature_connections, dependent: destroy

# citycode.rb:
has_many :feature_connections, dependent: destroy

在数据库级别(添加迁移):

# add NOT NULL constraint 
change_column :feature_connections, :citycode_id, :integer, null: false
change_column :feature_connections, :professional_id, :integer, null: false

您可能还想添加 foreign key 约束以防止 citycodesprofessionals 在有关联记录时被删除(除非您使用 dependent: destroy):

add_foreign_key :feature_connections, :citycodes
add_foreign_key :feature_connections, :professionals