为什么两个相同的关联之一 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
约束以防止 citycodes
和 professionals
在有关联记录时被删除(除非您使用 dependent: destroy
):
add_foreign_key :feature_connections, :citycodes
add_foreign_key :feature_connections, :professionals
我为 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
约束以防止 citycodes
和 professionals
在有关联记录时被删除(除非您使用 dependent: destroy
):
add_foreign_key :feature_connections, :citycodes
add_foreign_key :feature_connections, :professionals