Rails:使用非标准ID的belongs_to和has_many

时间:2011-03-16 08:54:39

标签: ruby-on-rails activerecord

我有两个型号,项目和产品如下:

irb(main):007:0> Item
=> Item(id: integer, identification_number: string, production_date: date, 
        created_at: datetime, updated_at: datetime, going_in: boolean)
irb(main):008:0> Product
=> Product(id: integer, sku: string, barcode_identification: string, 
           created_at: datetime, updated_at: datetime)

将此视为特定产品的项目。

我设法通过

引用特定产品的所有项目(Product.find(1).items)
class Product < ActiveRecord::Base
  has_many :items, :foreign_key => "identification_number", 
                   :primary_key => "barcode_identification"
end

但我似乎无法推荐特定商品的产品。 这就是我现在所拥有的:

class Item < ActiveRecord::Base
  set_primary_key :identification_number
  belongs_to :product, :foreign_key => "barcode_identification"
end

就我的理解而言:数据库是关注的,这应该有效。除了它没有。也许我错过了这里的一些东西?我对rails很新(大约一个月或更短的时间。)

2 个答案:

答案 0 :(得分:15)

是否必须是belongs_to?由于您同时指定了主键和外键,为什么不指定

class Product < ActiveRecord::Base
  has_many :items, :foreign_key => "identification_number", 
                   :primary_key => "barcode_identification"
end

class Item < ActiveRecord::Base
  has_one :product, :foreign_key => "barcode_identification", 
                    :primary_key => "identification_number"
end

答案 1 :(得分:1)

您的项目表中必须有外键。 我假设barcode_identification_id是items表中的列(外键)。 如果您有其他列,则只需将其替换为。

试试这样:

class Product < ActiveRecord::Base
  set_primary_key :barcode_identification
  has_many :items, :foreign_key => "barcode_identification_id"
end

class Item < ActiveRecord::Base
  set_primary_key :identification_number
  belongs_to :product
end