写作范围为许多一对多的关系 [英] Writing scopes for many-to-many relationships

查看:250
本文介绍了写作范围为许多一对多的关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序有3种型号:租房子住,部门,标准

I've got an application with 3 models: 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

我试图使承租人模型两个范围,这将让我按部门和绕圈寻找租房。

I'm trying to make two scopes in the Renter model that will let me find renters by department and by criterium.

这里的code,我有:

Here's the code I have:

# 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")

适用于自己的。但是,当我尝试连锁它们,

works on its own. However, when I try to chain them,

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

我得到一个错误,说:

I get an error that says:

  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

这是我在做什么任何想法错了?

Any ideas on what I'm doing wrong?

推荐答案

您需要引用表名称与范围:

You need to reference the table name in your scopes:

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

这篇关于写作范围为许多一对多的关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆