首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ActiveRecord对多对多查询设置条件

使用ActiveRecord对多对多查询设置条件
EN

Stack Overflow用户
提问于 2009-12-11 07:39:09
回答 1查看 438关注 0票数 1

我的模型中有以下关系:

代码语言:javascript
复制
class Show < ActiveRecord::Base
  has_many :service_shows
  has_many :services, :through => :service_shows
end

class Service < ActiveRecord::Base
  has_many :service_shows
  has_many :shows, :through => :service_shows
end

class ServiceShow < ActiveRecord::Base
  belongs_to :show
  belongs_to :service
end

我想要查询给定服务的所有具有rec_status = 'A‘的节目,但我的ActiveRecord技能只有三天,所以我没有足够的经验。如果我理解正确的话,我可以简单地调用service.shows并过滤返回的列表,但我只想从数据库中检索我需要的记录--我不想把处理器时间和内存浪费在我不想要的记录上。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-12-11 09:27:15

从您的描述中,听起来像是有:rec_status列的节目。在此基础上,我建立了一些样本数据:

代码语言:javascript
复制
Show.create!(:name => 'One', :rec_status => 'A')
Show.create!(:name => 'Two', :rec_status => 'B')

Service.create!(:name => 'Service One')
Service.create!(:name => 'Service Two')

Show.first.services = Service.all
Show.last.services = Service.all

正如你所提到的,只要提供一项服务,你就可以恢复所有的节目:

代码语言:javascript
复制
service = Service.first
service.shows

如果要选择记录的子集,可以使用finder调用来扩展链:

代码语言:javascript
复制
service.shows.all(:conditions => {:rec_status => 'A'})

更好的是,您可以在Show模型上将其捕获为命名作用域:

代码语言:javascript
复制
class Show < ActiveRecord::Base
  has_many :service_shows
  has_many :services, :through => :service_shows

  named_scope :for_status, lambda {|status_flag| {:conditions => {:rec_status => status_flag}} }
end

然后使用它而不是传递:conditions散列:

代码语言:javascript
复制
service.shows.for_status('A')
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1884899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档