在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
是两个数组的总和,不具备有关可用类关系的结构知识。在这种情况下如何重新建立?
答案 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