2011-09-21 28 views
0

我正在尝试创建一个多条件搜索表单。我想通过GET提交所有的搜索片段,如果他们有一个值分配,我希望他们评估。我无法抓住的东西是建立一个查询,这将允许我在通过关联进行更多查询的时候对其进行分层。has_many通过关联和多个搜索条件,我该如何做这项工作?

只给你的我的模型是如何建立一个想法:

class Client < ActiveRecord::Base 
    has_many :campaigns 
    has_many :pieces, :through => :campaigns 
end 

class Campaign < ActiveRecord::Base 
    belongs_to :client 
    has_many :pieces 
end 

class Piece < ActiveRecord::Base 
    belongs_to :client 
end 

现在,记住,模型,我使用的collect方法抢在共同拥有的组织碎片。

if params.has_key?(:criteria) 
    @selected_client = Client.where(:organization => "Org1") 
    @pieces = @selected_client.collect{ |c| c.pieces }.flatten 
end 

是否有某种格式化查询字符串的方式,以便我可以缩小@pieces,再多几次?假设我想通过关联再次使用它,以获得具有另一个相同客户端标准的作品...

非常感谢!我的大脑在这一点上是一个椒盐卷饼。

回答

1

我不确定我是否想要做的很好。如果你想获得符合客户标准,在轨道3所有作品,你可以这样做:

@pieces = Piece.joins(:campaign => :client).where(:clients => {:organization => criteria}) 

摆脱组织“ORG1”属于客户所有作品。

@Andrew表示,您可以根据需要添加新条件来堆叠尽可能多的语句。 See this for more information

+0

呜呼!我的大脑仍然从我的耳朵中滴落,但我还有其他几个要做的,希望到最后,我将掌握它。我花了一段时间才得到,因为我的一个关联设置不正确。 – counterbeing

0

您的第一段中断,仅供参考。

如果@pieces是一个数组,您可以使用find块来进一步缩小搜索范围。虽然这会将负载放在服务器CPU上而不是SQL数据库上。

您可以堆栈where声明和Rails会自动为您创建一个查询。这是从我们的网站的应用程序商店的部分一些示例代码:

@platform = params[:platform] 
@category = params[:category] 
@search = params[:app_q] 

# Get initial SQL, narrow the search, and finally paginate 
@apps = App.live 

@apps = @apps.where("platform = ?", AppPlatforms.value(@platform)) if AppPlatforms.value(@platform) 
@apps = @apps.where("(name LIKE ? OR description LIKE ?)", "%#{@search}%", "%#{@search}%") if @search 
@apps = @apps.where("id IN(?)", @cat.apps) if @category && @cat = Category.find_by_id(@category) 

@apps = @apps.paginate(:page => params[:page], :per_page => 10, :order => "name") 

而不是使用collect,你应该能够使用@selected_client.pieces.where(...)来缩小搜索下来通过SQL的。

我希望这是一个正确的方向!

+1

嘿,在那里,我玩了一下,但没有完全明白。我的一个协会可能会引起一个问题,但另一个解决方案似乎可以解决我的问题。非常感谢你的回应! – counterbeing