【问题标题】:Rails has_many belongs_to foreign_key primary_key confusionRails has_many belongs_to foreign_key primary_key 混淆
【发布时间】:2014-02-17 11:37:21
【问题描述】:

我无法使用 id 字段作为 primary_id 设置我的表(我的意思是它们在那里,但它们对业务没有任何意义)。即 sales 和 customer 表都来自我们的 Microsoft SQL 数据库。

在销售表中,我有一个名为“customer_id”的字段,它与客户表中的“customer_id”(不是“id”字段)匹配。我的“customer_id”字段数据类型设置为整数,但在迁移中我从未指定它们是否是键。我只对它们进行了索引。

销售属于客户,客户有很多销售,所以我试图建立 has_many 和 belongs_to 关联。

sale.rb

class Sale < ActiveRecord::Base

    belongs_to :customer, primary_key: "customer_id", foreign_key: "customer_id"

end

客户.rb

class Customer < ActiveRecord::Base

    has_many :sales


end

但是,当我得到 rails 控制台并尝试对此进行测试时,我无法通过 SQL 搜索 customer_id,只搜索 customers 表中的 id。

轨道控制台

    2.0.0-p353 :001 > c = Customer.find_by_customer_id(400123)
  Customer Load (2.0ms)  SELECT "customers".* FROM "customers" 
WHERE "customers"."customer_id" = 400123 LIMIT 1
 => #<Customer id: 16271, customer_id: 400123, customer_name: "ABC", 
customer_street: "ABC", customer_suburb: "ABC", customer_state: "ABC",
customer_postcode: "ABC", dispatch_location_price_list: "ABC", customer_selling_price_list: 
"ABC", customer_status: "ABC", line_of_business_id: "ABC", line_of_business: "ABC", 
market_segment_id: "ABC", market_segment_name: "Other", customer_rep_id: 123, customer_rep_name: "ABC"

2.0.0-p353 :002 > c.sales
  Sale Load (7.1ms)  **SELECT "sales".* FROM "sales" 
WHERE "sales"."customer_id" = $1      [["customer_id", 16271]]**
 => #<ActiveRecord::Associations::CollectionProxy []> 

具体来说,我只想说最后一点 [["customer_id', 400123]]。

我知道这可能很明显,但由于我仍在学习很多这些东西需要一点时间才能深入了解(很多情况下,我只是通过提问来回答我的问题,但今晚不是这样)。任何建议将不胜感激。

在我的研究中,我在 API 中找到了this

4.2.2.7 :primary_key

按照惯例,Rails 假定用于保存主要的列 这个模型的关键是 id。您可以覆盖它并明确指定 带有 :primary_key 选项的主键。

这让我觉得我应该使用 primary_key,因为“id”字段不是要查找的字段。

我也读过this thread,但我认为这可能与我的情况有点不同。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rails-activerecord model-associations


    【解决方案1】:

    您是否尝试将self.primary_key = :customer_id 添加到Customer 模型?

    【讨论】:

    • 不。不过我会试一试。一定要睡一会儿。我会让你知道我是怎么走的。感谢您的建议。
    • 轰隆隆!那很快。先生你真棒。我已经看到了使用 self 的一些细节。但不知道您可以这样做来指定主键。这将对我有很大帮助,因为我的所有表都存在从 MS SQL 中提取的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多