主键关联不渗透查看

时间:2018-08-23 19:13:00

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

在Rails视图中

<%= packageoffer.id %> <%= packageoffer.structure.nil? %>

返回3817 true

但是,在控制台中查询时

al = Available.find(3817)
al.structure

返回一个对象。 #<Structure id: "CAF401100", product_code: "CAF401100", [...]
因此,视图中的packageoffer.structure.nil?应该返回false

试图弄清楚发生了什么...类已通过创建关联的方式定义,如控制台查询所证明的那样:

class Available < ActiveRecord::Base
  belongs_to :structure, class_name: 'Structure', primary_key: 'product_code'

class Structure < ActiveRecord::Base
  self.primary_key = 'product_code'
  has_many :availables, primary_key: :product_code 

控制器动作有点复杂,将源自不同类的两个数组组装在一起:

@availables = Available.where(['event_id = ?', @event.id]).to_a
@packageoffers = (@packageoffers_a + @availables).sort_by(&:cost)

然后视图有条件地处理组装好的数组

@packageoffers.each do |packageoffer|
  if @availables.include?(packageoffer)

然后尝试调用该关系

    packageoffer.structure.nil?

为什么此时无法访问该关联?

更新一种思路是,求和数组@packageoffers是两个数组的总和,不具备有关可用类关系的结构知识。在这种情况下如何重新建立?

2 个答案:

答案 0 :(得分:1)

您说重启控制台后,每次在此对象上调用nil时,您都会看到.structure。在这种情况下,您尚未成功将结构外键保存到该对象。

如果您试图通过控制台设置此关联,那么您可能会受到误导性事实的伤害,因为在某些情况下,您在控制台中设置的关联实际上并未写入数据库并且不会持久存在。如果是这样,则此讨论可能对您有所帮助:Create association between two instancied objects

答案 1 :(得分:0)

第1课:

在定义这些非标准关联时,请在每次更改EACH后重新启动控制台,以避免在花园路径上发送该信息。

第2课:

请勿混淆外键和主键。通过将关联定义为以下方式解决了该问题:

belongs_to :structure, class_name: 'Structure', foreign_key: 'product_code