重构属性到模型关联

时间:2015-10-26 09:56:40

标签: ruby-on-rails activerecord

我把自己画在角落里。

我有一个定义的模型:

create_table "invoices", force: :cascade do |t|
  t.string   "organization"
  ...
end

现在业务规则发生了变化,我需要一个'组织'要在其位置链接的对象。

我已经有了一个组织模型。我可以轻松添加' organization_id'属于发票模型并声明关联。

更新模型后,我恐怕无法再达到'组织'的字符串价值。因为'组织'属性将被关联魔法方法掩盖?

那么,如何定义一个迁移步骤来将当前发票表更新为find_or_create_by(name:xxx>),其中xxx是组织列中的当前字符串?

2 个答案:

答案 0 :(得分:1)

拥有organization_id的重点在于您将从Organization模型中调用关联数据...所以我会从中获取name /其他数据如果是我:

#app/models/invoice.rb
class Invoice < ActiveRecord::Base
   belongs_to :organization
   alias_attribute :name, :location, to: :organization, prefix: true #-> organization_name
end

这样您就可以在organization_id表格中加入invoices,然后就可以调用关联数据了:

@invoice = Invoice.find params[:id]
@invoice.organization_name #-> "Name"

如果您想在invoices表中保留组织字段,则必须重命名该关联:

#app/models/invoice.rb
class Invoice < ActiveRecord::Base
  belongs_to :partner, class_name: "Organization", foreign_key: :organization_id
end

答案 1 :(得分:1)

您始终可以使用:read_attribute方法为您的发票模型。如果要获取属性值:

@invoice.read_attribute(:organization)