belongs_to,foreign_key不在一个方向上工作

时间:2015-06-09 21:22:25

标签: ruby-on-rails foreign-keys belongs-to

class Position < ActiveRecord::Base
    belongs_to :product, foreign_key: :symbol
end

class Product < ActiveRecord::Base
    has_many :positions, primary_key: :symbol, foreign_key: :symbol
end

当我这样做时

Product.first.positions.first我正在收回产品。

但是,当我Position.first.product时,我什么都没得到。

当我查看查询生成的SQL时,它是:

SELECT "products.*" FROM "products" WHERE "products.id" = ? LIMIT 1 [["id", 0]]

为什么?

3 个答案:

答案 0 :(得分:2)

生成的SQL使用products.id而不是products.symbol,因为您没有告诉它关联应该使用symbol作为主键而不是默认的id }。因此,在Position课程中,只需将primary_key: :symbol添加到belongs_to,我认为这样做。

答案 1 :(得分:0)

试试这个:

class Product < ActiveRecord::Base
  self.primary_key = "symbol"
end

答案 2 :(得分:0)

首先,您需要修改模型Product的创建。

您需要按以下方式创建它:

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products, id: false do |t|
      t.string :symbol, null: false

      t.timestamps
    end

    add_index :products, :symbol, unique: true
  end
end

然后让您的模型了解primary_key,而不是id

class Product < ActiveRecord::Base
  self.primary_key = "symbol"
end

之后,当您执行Product.last时,它将生成以下查询:

Product.last
# Product Load (0.3ms)  SELECT  "products".* FROM "products"  ORDER BY "products"."symbol" DESC LIMIT 1