我在设置关系和查询方面遇到了麻烦。这是对我想要完成的事情的简单解释。假设我有三个模型:图纸,更改和修订。
绘图有很多修订
变更有很多修订
通过修订,变更有很多图纸
图纸包含主键字段和字符串:drawing_number
,每个图形都是唯一的。
当我创建一个新的Change
时,我有一个嵌套的表单,可以在Change中创建新的Revisions。我希望新版本中的一个字段是drawing_number
,即使外键是drawing_id
。有没有办法设置它以便我在表单中输入drawing_number
,然后找到与drawing_id
匹配的drawing_number
,并将drawing_id
添加到{{1}}修订表中的drawing_id列。
换句话说,我想使用不是外键的关联字段将修订与图纸联系起来。
例如:我有drawing_id = 7和drawing_number = A7114B1
我创建了一个新的Change,其中嵌入了一个Revision表单。我在表单中输入drawing_number A7114B1,但Revision模型只有一个drawing_id列,而不是drawing_number列。我希望逻辑找到与drawing_number匹配的drawing_id,并将drawing_id放入Revisions表中。
答案 0 :(得分:1)
drawing_number
== drawing_id
如果我理解得很清楚,您的数据已经正确建模,但您希望在Drawing
上为您的属性名称添加别名。这可以通过#alias_attribute
:
class Drawing < ActiveRecord::Base
alias_attribute :drawing_number, :drawing_id
end
现在,您可以使用drawing_number
完全按照drawing_id
的方式使用> Drawing.where(drawing_id: 1) == Drawing.where(drawing_number: 1)
=> true
,例如:
drawing_number
drawing_id
!= Drawing
我假设number
具有属性Revision
而drawing_number
具有属性class Drawing < ActiveRecord::Base
has_many :revisions, foreign_key: :drawing_number, primary_key: :number
end
cass Change < ActiveRecord::Base
has_many :revisions
end
class Revision < ActiveRecord::Base
belongs_to :drawing, foreign_key: :drawing_number
belongs_to :change
end
,两者都是字符串。您需要手动设置关联的foreign_key和primary_key,如下所示:
{{1}}