Ruby on rails 4 在Rails中重定外键的目标

Ruby on rails 4 在Rails中重定外键的目标,ruby-on-rails-4,rails-activerecord,Ruby On Rails 4,Rails Activerecord,tldr 在Rails中,如何将外键的目标列设置为其父项id以外的列 迄今为止的努力 这感觉应该是一个简单的操作,但我几乎没有成功。我有一个父模型Order,它有许多OrderItems,但我希望OrderItems的外键引用Order的reference1和reference2字段的组合 我已经看了一些路径: 初试 在这里,我创建了一个独特的引用列,在创建之前,我们使用reference1+reference2填充了该列,并为OrderItem提供了一个相应的order\u引用列 我尝试了上述

tldr

在Rails中,如何将外键的目标列设置为其父项id以外的列

迄今为止的努力

这感觉应该是一个简单的操作,但我几乎没有成功。我有一个父模型Order,它有许多OrderItems,但我希望OrderItems的外键引用Order的reference1和reference2字段的组合

我已经看了一些路径:

初试

在这里,我创建了一个独特的引用列,在创建之前,我们使用reference1+reference2填充了该列,并为OrderItem提供了一个相应的order\u引用列

我尝试了上述几种变体,但无法说服OrderItem接受unique_引用作为密钥。它设法链接记录,但当我调用OrderItemorder_引用时,它将返回父项id的字符串化版本,而不是与相应的Orderunique_引用字段匹配的内容

第二次尝试

我从Order类中删除了unique_reference列,将其替换为一个同名的方法和一个has_many块:

class Order
  has_many :order_items, -> (order) { where("order_items.order_reference = :unique_reference", unique_reference: order.unique_reference) }

  def unique_reference
    "#{reference1}#{reference2}"
  end
end

class OrderItem < ActiveRecord::Base
  belongs_to :order, ->(item){ where("CONCAT(surfdome_archived_order.source, surfdome_archived_order.order_number) = surfdome_archived_order_items.archived_order_reference") }
end
这一次,调用Orderorder_项会引发SQL错误: “where子句”中的未知列“order\u items.order\u id”:从order\u items.order\u id=1和order\u items.order\u reference='ref1ref2'中选择order\u items.*

我想尝试的每个SQL查询都有相同的潜在问题——在某个地方,Rails决定我们仍然隐式地尝试按order\u id键,而我找不到其他方法来说服它

其他选择

目前,我的选择似乎是使用,或者只是忽略Rails的内置关联,并用db查询攻击我们自己的关联,但这两种选择都不理想——而且Rails似乎肯定有一个切换外键的选项。但如果是,它在哪里

谢谢

萨沙

class Order
  has_many :order_items, -> (order) { where("order_items.order_reference = :unique_reference", unique_reference: order.unique_reference) }

  def unique_reference
    "#{reference1}#{reference2}"
  end
end

class OrderItem < ActiveRecord::Base
  belongs_to :order, ->(item){ where("CONCAT(surfdome_archived_order.source, surfdome_archived_order.order_number) = surfdome_archived_order_items.archived_order_reference") }
end