【问题标题】:Why is my foreign key association not yielding results?为什么我的外键关联没有产生结果?
【发布时间】:2014-06-18 02:18:51
【问题描述】:

我的 rails 应用程序中有两个模型,AppointmentPolicy。我的约会模型has_many :policies, class_name: "Policy", foreign_key: 'writing_code' 和我的策略模型belongs_to :appointment。每个表中的writing_code 列是一个字符串。

虽然看起来已经建立了关联(我的应用程序运行),但@appointment.policies 没有产生任何结果。有人可以解释一下我在这里出错的地方吗?

另外,为了抢先回答这个显而易见的问题,我不能简单地使用appointment_id,因为我将上传与每条记录相关联的约会(或用户)“编写代码”的保单数据。数据将不包括约会 ID,因为它来自单独的第三方系统。

提前感谢您的帮助!

编辑:

架构:

create_table "policies", :force => true do |t| 
t.integer "product_id" 
t.decimal "premium" 
t.string "writing_code" 
t.datetime "created_at", :null => false t.datetime "updated_at", :null => false end`

【问题讨论】:

  • yields no results 是什么意思?你收到nil 错误吗?您是否已将policy_id 添加到appointments 表中?
  • 我没有收到任何错误.. 结果是 []。为什么我通过writing_code 列关联时需要在此处添加policy_id
  • 所以writing_code 是外键。我忽略了这一点。你得到的是一个空数组。你认为它不应该是空的吗?在控制台中尝试。验证您是否真的应该有关联的约会和政策对象
  • 我在控制台中也得到了一个空数组:(
  • 看看日志中生成的sql。然后获取该 sql 字符串并在您的数据库控制台中尝试它。它也不会在那里返回任何结果,但您也许可以调试该问题。它可能与数据相关,更容易查看。

标签: ruby-on-rails ruby-on-rails-3 postgresql


【解决方案1】:

我认为这是你的问题:

你有:

class Appointment 
  has_many :policies, class_name: "Policy", foreign_key: 'writing_code'
end

这是guides says

“按照惯例,Rails 假定在这个模型上用于保存外键的列是关联名称加上后缀 _id。”

以下是指南中的示例:

class Order < ActiveRecord::Base
 belongs_to :customer, class_name: "Patron",
                    foreign_key: "patron_id"
end

在您的情况下,您的 class 名称是 Policy,但您的 foreign_key 名称是 writing_code。这不是传统的。

【讨论】:

    【解决方案2】:

    Rails 非常固执己见。保持 Rails 喜欢的工作方式,生活会变得更轻松。 我也完全同意@WaliAli 所说的。

    “@appointment.policies 没有结果”

    要让约会有很多策略,每个策略都需要在模型和表模式中与约会相关联。

    这意味着策略应该有一个字段“appointment_id”,它是一个整数。

    在策略表中添加一个约会 ID 字段。

    $ rails generate migration AddAppointmentIdToPolicies appointment_id:integer
    $ rake db:migrate
    

    然后你执行以下操作:

    class Policy
      has_many :appointments     # this lets you do @policy.appointments
    end
    
    class Appointment
      belongs_to :policy         # this lets you do @appointment.policy
    end
    

    对于 99% 的 Rails 应用程序以另一种方式执行此操作,其中 has_many 和 belongs_to 包含更多可选参数是代码异味。

    [更新 1:]

    “我有将通过 .csv 从旧系统上传的政策数据 文件。该数据将不知道约会ID,即 为什么我需要使用 writing_code 作为外键值,因为它是 唯一可以关联两个模型的通用数据。”

    我建议在您的 CSV 导入程序中解决这个问题。 导入每条记录时,查找具有匹配“编写代码”的约会记录,然后保存记录以包含约会 ID。

    类似这样的:

    # Inside your CSV importer script
    
    csv_rows.each do |row|
      policy = Policy.new
      policy.appointment_id = Appointment.find(writing_code: row.writing_code).id
      # more code here..
      policy.save
    end
    

    【讨论】:

    • 我同意这将是设计此关联的传统方式。不幸的是,因为这个应用程序需要适应遗留系统,我不确定这是一个可行的选择。在此示例中,我有将通过 .csv 文件从旧系统上传的策略数据。该数据将不知道约会ID,这就是为什么我需要使用writing_code作为外键值,因为它是唯一可以关联两个模型的公共数据。我很想保持这种“传统”,但我不知道如何才能做到这一点......感谢您的想法
    • 有趣的解决方案.. 我需要更深入地研究这个选项,以确定它是否适合所有场景。感谢@evolve 的替代建议
    猜你喜欢
    • 2020-09-23
    • 2019-02-03
    • 2022-11-20
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多