Rails作用域和关联查询

16

我尝试了所有我认为可以解决这个问题的方法,但是都没有找到答案。

在Rails 3中,我需要查找所有汽车上有CD播放器的用户。一辆汽车有一个用户和一个收音机,一个用户属于一辆汽车,一个收音机有多辆汽车。

我不知道如何通过用户模型中的scope执行此搜索。

class User  
  belongs_to :car

class Car  
  belongs_to radio
  has_one :user, :dependent => destroy

class Radio  
  has_many :cars

如果你希望得到帮助,你应该告诉别人你的数据库模式是什么样子。 - Иван Бишевац
3
“一个用户属于一辆汽车,一台收音机有许多汽车”这是一个奇怪的模型。您能展示一些代码吗? - alf
2个回答

33

我假设你的意思是这样的:

汽车具有radio_id,用户具有car_id,因为一台收音机可以连接多辆汽车,而每辆汽车只能被一个用户拥有。外键所在的表格通常是关系的belongs_to一端。

如果不确定你想要的结构,以下类似的代码应该能够工作:

scope :with_cd_player, joins(:cars).where('cars.radio_id is not null')

如果单选框中有一个类别列,以下代码将可行。

scope :with_cd_player, joins(:car => :radio).where('cars.radio_id is not null').where("radios.category = 'cd_player'")

对于Rails版本 >= 4:

scope :with_cd_player, -> { joins(:cars).where.not(cars: { radio_id: nil }) }

7
从 Rails 4 开始,作用域主体需要可调用,所以代码应为:scope :with_cd_player, -> { joins(:cars).where('cars.radio_id is not null') } - Sascha Gehlich

11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接