gpt4 book ai didi

ruby-on-rails - Activerecord 关联问题 : getting has_many :through to work

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:35 26 4
gpt4 key购买 nike

我正在用 Ruby on Rails 构建一个应用程序,我包括了我的 3 个模型(及其迁移脚本)来展示我正在尝试做什么,以及什么不起作用。概要如下:我的应用程序中有属于团队的用户,每个团队可以有多个教练。我希望能够提取适用于用户的教练列表。

例如,用户 A 可能属于团队 T1 和 T2。 T1 和 T2 队可以各有四名不同的教练,以及一名共同的教练。我希望能够通过简单地说:

u = User.find(1)
coaches = u.coaches

这是我的迁移脚本,以及我模型中的关联。我在设计中做错了什么吗?我的联想是否正确?

class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.column :login, :string, :default => nil
t.column :firstname, :string, :default => nil
t.column :lastname, :string, :default => nil
t.column :password, :string, :default => nil
t.column :security_token, :string, :default => nil
t.column :token_expires, :datetime, :default => nil
t.column :legacy_password, :string, :default => nil
end
end

def self.down
drop_table :users
end
end

class CreateTeams < ActiveRecord::Migration
def self.up
create_table :teams do |t|
t.column :name, :string
end
end

def self.down
drop_table :teams
end
end

class TeamsUsers < ActiveRecord::Migration
def self.up
create_table :teams_users, :id => false do |t|
t.column :team_id, :integer
t.column :user_id, :integer
t.column :joined_date, :datetime
end
end

def self.down
drop_table :teams_users
end
end

以下是模型(不是整个文件):

class User < ActiveRecord::Base

has_and_belongs_to_many :teams
has_many :coaches, :through => :teams

class Team < ActiveRecord::Base
has_many :coaches
has_and_belongs_to_many :users

class Coach < ActiveRecord::Base
belongs_to :teams
end

这是我尝试拉动教练时发生的情况:

u = User.find(1)
=> #<User id: 1, firstname: "Dan", lastname: "Wolchonok">
>> u.coaches
ActiveRecord::StatementInvalid: Mysql::Error: #42S22Unknown column 'teams.user_id' in 'where clause': SELECT `coaches`.* FROM `coaches` INNER JOIN teams ON coaches.team_id = teams.id WHERE ((`teams`.user_id = 1))

这是sql中的错误:

Mysql::错误:#42S22Unknown column 'teams.user_id' in 'where clause': SELECT coaches.* FROM coaches INNER JOIN teams ON coaches.team_id = teams.id WHERE ((teams.user_id = 1))

我的 :through 子句中是否遗漏了什么?我的设计完全不对吗?有人可以指出我正确的方向吗?

最佳答案

你不能连续两次执行 has_many :through 。它会告诉你这是一个无效的关联。如果您不想像上面那样添加 finder_sql,您可以添加一个模仿您正在尝试执行的操作的方法。

  def coaches
self.teams.collect do |team|
team.coaches
end.flatten.uniq
end

关于ruby-on-rails - Activerecord 关联问题 : getting has_many :through to work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/198831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com