2011-08-03 62 views
1

对不起,我仍然有点用绿色的Ruby on Rails绿色至少可以说,所以我会感激即使被引导在同一个方向。命名范围/过滤器问题

所以......我有三个数据库表,我们称之为人员,工作和帽子。 我有只返回做某些工作的人一个范围:

named_scope :emergency_workers, :include => :job, :conditions => {'jobs.name' => 'Police', 'jobs.name' => 'Fire','jobs.name' => 'paramedic'} 

我有只返回戴帽子人范围:

named_scope :hat_wearers, :include => :job, :joins => :hat, :conditions => ["hats.name IS NOT ?", nil] 

我的问题是,我该如何定义农民说,除非他们从事这项特殊工作,否则只向我展示戴帽子的人(如上所述)。所以,我的代码将返回所有帽子佩戴者和所有农民。

如果使的感觉甚至是舔,但是我会指导非常感谢不知道......

+0

你使用的是Rails 3吗?这看起来像Rails 2语法。 – Andrew

+0

那么Rails 3的语法是什么?谢谢 – Christian

回答

2

我不知道如何构造,作为一个单一的查询,但使用Rails 3语法,可以指定给定的范围,然后创建一个返回两个范围的认定独特的结果的方法:

class People < ActiveRecord::Base 
    ... 
    scope :emergency_workers, joins(:jobs).where('jobs.name IN (?)',['Police','Fire','Paramedic']) 
    scope :hat_wearers, joins(:hats).where('hats.name IS NOT ?', nil) 
    scope :farmers, joins(:jobs).where('jobs.name= ?', 'farmer') 
    ... 

    def hats_and_farmers 
    result = self.class.hat_wearers + self.class.farmers 
    result.uniq 
    end 
    ... 
end 

编辑:

我不知道该怎么写SQL做了查找基于三张桌子,但如果哟ü做(按你的意见)只写:

People.find_by_sql('Your custom from scratch query goes here.') 

参见:http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql

所有从模型调用它的作用是告诉你期待什么样的对象的查询返回,所以Rails会它可以将它们实例化为可供您使用的对象。没有SQL是以这种方式为您预先编写的。

+0

请参阅上面的编辑 - 如果您知道如何在原始SQL中编写它,您总是可以使用'.find_by_sql()' – Andrew

0

我建议使用两个单独的命名范围并将它们链接在一起。你可以使用现有的hat_wearers范围,并定义范围,是以作业的名称,排除:

named_scope :hat_wearers, :joins => :hat, :conditions => ["hats.name IS NOT ?", nil] 
named_scope :without_worker, lambda{|j| :joins => :job, :conditions => ['jobs.name != ?', j]} 

现在你可以把它们结合在一起,并呼吁person.hat_wearers.without_worker('farmer')以及单独使用的范围。

警告:根据您使用的Rails版本,链接范围:连接可能会变得棘手。有几个人在网上写了一些关于它的问题,并在这个网站上询问了它,所以如果你遇到困难,请检查一下。

+0

如果您链接范围,是否具有附加性?那么,我会怎么说让我看看帽子穿着者*和*农民(即hats.name不是?或jobs.name ='farmer')。 Sooo希望我现在可以写一行SQL。 – Christian

+0

你被允许编写SQL。只需编写People.find_by_sql(*您的完全自定义SQL查询*) – Andrew