加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Activerecord协会问题:获得has_many:通过工

发布时间:2020-12-17 02:50:03 所属栏目:百科 来源:网络整理
导读:我正在 Ruby on Rails中构建一个应用程序,我将包括我的3个模型(及其迁移脚本),以显示我正在尝试做什么,以及什么不起作用.这是纲要:我的应用程序中的用户属于团队,每个团队可以有多个教练.我希望能够提取适用于用户的教练列表. 例如,用户A可以属于T1和T2队.
我正在 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,:default => nil
      t.column :lastname,:default => nil
      t.column :password,:default => nil
      t.column :security_token,:default => nil
      t.column :token_expires,:datetime,:default => nil
      t.column :legacy_password,: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列’teams.user_id’在’where子句’中:SELECT coaches.* FROM教练INNER JOIN团队ON coaches.team_id = teams.id WHERE((teams.user_id = 1))

我错过了我的:through子句吗?我的设计完全关闭了吗?有人能指出我正确的方向吗?

解决方法

你不能连续两次做一个has_many:它会告诉你它是一个无效的关联.如果你不想像上面那样添加finder_sql,你可以添加一个模仿你想要做的事情的方法.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读