【问题标题】:Nested include with where statements using ActiveRecord使用 ActiveRecord 嵌套包含 where 语句
【发布时间】:2014-10-17 11:07:58
【问题描述】:

我的应用程序的结构如下: c

lass Project < ActiveRecord::Base
  has_and_belongs_to_many :team_members
  has_one :legal_contract
  has_many :documents
end

class ProjectsTeamMember < ActiveRecord::Base
  belongs_to :project
  belongs_to :team_member
end

class LegalContract < ActiveRecord::Base
  belongs_to :project
end

class TeamMember < ActiveRecord::Base
  has_many :projects_team_members
  has_many :projects, through: :projects_team_members
  has_and_belongs_to_many :projects
end

我正在尝试查找与 legal_contract 关联且具有数组中的一个 ID 的所有 team_members。尝试包含方法:

  team_members = TeamMember.includes( {projects_team_members: [ { project: :legal_contract} ] } )

我现在想知道如何缩小范围以仅提取那些 tmember 而不是全部。我试过了

arry= [1,3,5]
team_members = TeamMember.includes( {projects_team_members: [ { project: :legal_contract} ] }).where('legal_contract.id IN', arry)

但出现错误

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...s"."updated_at" AS t0_r6, "projects_team_members"."" AS t1_r...

有人知道吗?谢谢

**更新** 感谢卡林根

TeamMember.joins(:projects => :legal_contract).where(legal_contracts: { id: [1,3,5] })

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord include


    【解决方案1】:

    您需要为projects_team_members 设置一个主键,您确定有一个吗?

    在尝试查找 projects_team_members 时,似乎 Rails 正在创建无效语法:

    "projects_team_members".""

    【讨论】:

    • 嗨 Brennan,这是多对多关联,我在该表上没有主键,只有 project_id 和 team_member_id- 可以正常工作。
    • 啊,是的,很抱歉@evoo
    【解决方案2】:

    您需要通过这样的连接来完成此操作:

    TeamMember.joins(:projects => :legal_contract).where(legal_contracts: { id: [1,3,5] }) 
    

    首先您加入项目表及其法律合同。然后搜索所有具有给定 ID 的法律合同。

    请注意,Where 子句中的键是复数形式,因为它是表的名称。

    【讨论】:

    • 我试过了,得到了 NoMethodError: undefined method `include?'对于 1:Fixnum
    • 我也尝试修改这个: TeamMember.joins(:projects => :legal_contract).where(legal_contract: { id: LegalContract.find(1,3,5) } ) 但得到了 ActiveRecord: :StatementInvalid: PG::UndefinedTable: 错误: 缺少表“legal_contract”的 FROM 子句条目
    • ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column team_members.legal_contract 不存在
    • @evoo 是名为 legal_contracts 的 LegalContract 的表名吗?如果是,则发布的解决方案应该可以正常工作。否则,您应该将键更改为正确的表名
    • 卡林根,是的。其他一切都完美无缺。我现在正在拔头发:/所以仔细检查并从legal_contracts返回记录中选择* - 在pgAdmin中测试。
    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2015-10-07
    • 2021-11-23
    • 2014-01-27
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多