【问题标题】:Has many through with different foreign key有很多通过不同的外键
【发布时间】:2012-09-25 04:41:33
【问题描述】:

我有以下:has_many :through 关系。

协会

class Profile < ActiveRecord::Base  
  has_many :teams
  has_many :projects, :class_name => "Project", :through => :teams
  has_many :leads, :class_name => "Projects"

class Project < ActiveRecord::Base
  has_many :teams
  has_many :developers, :class_name => "Profile", :through => :teams
  belongs_to :lead, :class_name => "Profile", :foreign_key => "developer_lead"

class Team < ActiveRecord::Base
  belongs_to :developer, :class_name => "Profile"
  belongs_to :project

当我尝试获取 Profiles 项目时,该关系未使用团队表中的正确键。

Rails C

1.9.3p194 :001 > Profile.first.projects

配置文件加载 (0.2 毫秒) SELECT "profiles".* FROM "profiles" LIMIT 1
项目负载 (0.2ms) SELECT "projects".* FROM "projects" INNER JOIN "teams" ON "projects"."id" = "teams"."project_id" WHERE "teams"."profile_id" = 1

应该是"teams"."developer_id" = 1

我尝试在 Profile 和 Project 模型中使用 :foreign_key =&gt; "developer_id",但似乎没有任何效果。

我觉得我对模型所做的更改没有产生任何影响,但每次更改后我都在重新启动 rails 控制台。

架构

create_table "profiles", :force => true do |t|
  t.datetime "created_at",          :null => false
  t.datetime "updated_at",          :null => false
end

create_table "projects", :force => true do |t|
  t.integer  "developer_lead"
  t.datetime "created_at",     :null => false 
  t.datetime "updated_at",     :null => false
end

create_table "teams", :id => false, :force => true do |t|
  t.integer  "developer_id"
  t.integer  "project_id"
  t.datetime "created_at",   :null => false
  t.datetime "updated_at",   :null => false
end 

【问题讨论】:

  • :foreign_key =&gt; "developer_id" 属于 has_many :teams。这会生成什么 SQL?
  • 啊,太好了,成功了。 SQL:SELECT "projects".* FROM "projects" INNER JOIN "teams" ON "projects"."id" = "teams"."project_id" WHERE "teams"."developer_id" = 1。如果你把它扔在一个答案中,我会接受它。

标签: ruby-on-rails foreign-key-relationship has-many-through


【解决方案1】:

:foreign_key =&gt; "developer_id" 属于 has_many :teams

此外,如果您遵守 Rails 约定并将所有外键名称以“_id”结尾,如“developer_lead_id”,它会使您的代码更清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多