【问题标题】:Writing scopes for many-to-many relationships为多对多关系编写范围
【发布时间】:2012-05-10 15:16:46
【问题描述】:

我有一个包含 3 个模型的应用程序:Renters、Departments、Criteria。

# app/models/department.rb

class Department < ActiveRecord::Base
  attr_accessible :name, :abbr

  has_many :renter_departments
  has_many :renters, :through => :renter_departments
end

# app/models/criterium.rb

class Criterium < ActiveRecord::Base
  attr_accessible :name

  has_many :renter_criteria
  has_many :renters, :through => :renter_criteria
end

我正在尝试在 Renter 模型中创建两个范围,让我可以按部门和标准查找租户。

这是我的代码:

# app/models/renter.rb

class Renter < ActiveRecord::Base

  # Relationships
  has_many :renter_departments
  has_many :renter_criteria
  has_many :departments, :through => :renter_departments
  has_many :criteria, :through => :renter_criteria

  # Scopes
  scope :from_department, lambda { |abbr| joins(:departments).where("abbr = ?", abbr) }
  scope :has_criterium, lambda { |criterium| joins(:criteria).where("name = ?", criterium) }

end

使用

Renter.from_department("SCS")

Renter.has_criterium("Economic considerations")

独立工作。但是,当我尝试链接它们时,

Renter.from_department("SCS").has_criterium("Economic considerations")

我收到一条错误消息:

  Renter Load (0.3ms)  SELECT "renters".* FROM "renters" INNER JOIN "renter_departments" ON "renter_departments"."renter_id" = "renters"."id" INNER JOIN "departments" ON "departments"."id" = "renter_departments"."department_id" INNER JOIN "renter_criteria" ON "renter_criteria"."renter_id" = "renters"."id" INNER JOIN "criteria" ON "criteria"."id" = "renter_criteria"."criterium_id" WHERE (abbr = 'SCS') AND (name = 'Economic considerations')
SQLite3::SQLException: ambiguous column name: name: SELECT "renters".* FROM "renters" INNER JOIN "renter_departments" ON "renter_departments"."renter_id" = "renters"."id" INNER JOIN "departments" ON "departments"."id" = "renter_departments"."department_id" INNER JOIN "renter_criteria" ON "renter_criteria"."renter_id" = "renters"."id" INNER JOIN "criteria" ON "criteria"."id" = "renter_criteria"."criterium_id" WHERE (abbr = 'SCS') AND (name = 'Economic considerations')
ActiveRecord::StatementInvalid: SQLite3::SQLException: ambiguous column name: name: SELECT "renters".* FROM "renters" INNER JOIN "renter_departments" ON "renter_departments"."renter_id" = "renters"."id" INNER JOIN "departments" ON "departments"."id" = "renter_departments"."department_id" INNER JOIN "renter_criteria" ON "renter_criteria"."renter_id" = "renters"."id" INNER JOIN "criteria" ON "criteria"."id" = "renter_criteria"."criterium_id" WHERE (abbr = 'SCS') AND (name = 'Economic considerations')

另外,

>> Renter.from_department("SCS").class
=> ActiveRecord::Relation
>> Renter.has_criterium("Economic considerations").class
=> ActiveRecord::Relation

关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: activerecord scopes scope-chain


    【解决方案1】:

    您要加入的表中有多个 name 列。使WHERE 子句使用renters.namedepartments.name 或具有适当name 列的任何表。

    【讨论】:

    • scope :has_criterium, lambda { |criterium| joins(:criteria).where("name = ?", criterium) } 更改为 scope :has_criterium, lambda { |criterium| joins(:criteria).where("criteria.name = ?", criterium) } 并修复了它。谢谢!
    【解决方案2】:

    您需要在您的范围内引用表名:

    scope :from_department, lambda { |abbr| joins(:departments).where("departments.abbr = ?", abbr) }
    scope :has_criterium, lambda { |criterium| joins(:criteria).where("criteria.name = ?", criterium) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多