2009-10-15 20 views
1

使用这些关联只有放大结果返回正确的结果,但是当我尝试搜索第二个关联时,它将返回0结果。如何从同一个连接表中搜索不同的条件?

has_one :magnification, 
    :class_name => 'ProductAttribute', 
    :foreign_key => 'product_id', 
    :conditions => {:key => 'Magnification'} 
has_one :objective_lens, 
    :class_name => 'ProductAttribute', 
    :foreign_key => 'product_id', 
    :conditions => {:key => 'Objective Lens Diameter'} 

define_index do 
    has magnification(:value), :type => :float, :as => :magnification 
    has objective_lens(:value), :type => :float, :as => :objective_lens_diameter 
end 

示例代码中使用

# returns expected results 
Product.search(nil, :with => {:magnification => (8.0..9.0)}) 

# returns 0 results 
Product.search(nil, :with => {:objective_lens_diameter => (31.0..61.0)}) 

但是,当我反向出现相反的define_index的顺序。因此,物镜口径结果返回正确的结果,并且放大倍率结果返回0

使用Rails V2.2,思维 - 狮身人面像作为一个插件v1.2.12和狮身人面像0.9.8

编辑:展望在生成的sql_query值显示第二个属性的连接使用错误的关联,因此它不会返回预期的结果。

简体结果:

SELECT 
    `products`.`id` * 2 + 1 AS `id`, 
    `products`.`id` AS `sphinx_internal_id`, 
    1234567890 AS `class_crc`, 
    `product_attributes`.`value` AS `magnification`, 
    `objective_lens_products`.`value` AS `objective_lens_diameter` 
FROM `products` 
    LEFT OUTER JOIN `product_attributes` ON product_attributes.product_id = products.id 
    AND `product_attributes`.`key` = 'Magnification' 
    LEFT OUTER JOIN `product_attributes` objective_lens_products ON objective_lens_products.product_id = products.id 
    AND `product_attributes`.`key` = 'Objective Lens Diameter' 
WHERE `products`.`id` >= $start 
    AND `products`.`id` <= $end 
GROUP BY `products`.`id` 
ORDER BY NULL 
+0

SQL是你的问题。它应该将产品属性连接到产品两次。但是,在将键匹配到物镜直径时,它会使用错误的连接。再次,我觉得这源于您定义关联的方式。 – EmFi 2009-10-16 15:59:52

+0

正如我上面提到的那样,正在生成的SQL来自Thinking Sphinx插件,当我将它添加到帖子中时,它是问题的根源。协会建设的方式没有错。 – Vizjerai 2009-10-16 18:42:36

回答

1

您能将sql_query分享给您的产品型号为development.sphinx.conf吗?真的,你在做什么应该适用于这两个属性,所以可能是生成的SQL命令中存在一个错误。

+0

我添加了查询生成剥离不需要的部分,它看起来像生成的SQL没有按预期生成。 – Vizjerai 2009-10-16 14:41:14

+0

@Pat,我仍然面临这个问题。你是否解决了这个问题? – Anikethana 2013-04-03 14:26:01

+0

@Anikethana自从这个主题活跃起来已经有几年了。你使用什么版本的思维狮身人面像? – pat 2013-04-05 00:47:37

0

狮身人面像的东西大多是正确的。搜索中的nils是多余的。但我真的不认为这是什么导致你的问题。

我认为你的问题来源于你的模型关系。特别是你的单一表格继承(STI)的黑客攻击,以及Sphinx处理索引的方式。

看来你基本上试图复制一个索引,所以它忽略了第二个索引。

我不完全确定如何解决它,添加查询到define_index块不起作用,因为所有where语句适用于所有后来定义的索引,不能被覆盖,只能添加到。思维狮身人面像也不适用于模型上的多个索引,因此您无法通过重新定义define_index块来修复它。

Thinking-Sphinx 1.2提供了Sphinx Scopes,您可能希望将其视为潜在解决方案。不幸的是它没有很好的记录,所以我不知道它是否会起作用。

鉴于Thinking-Sphinx STI和“Single Table Inheritance”的搜索引擎没有命中。我期望重新定义你们之间的关系,让铁轨处理STI,解决你们的问题。

它涉及到做这样的事情:

class ProductAttribute < ActiveRecord::Base 
    belongs_to :product 
    inheritance_column => :key 
    ... 
    common methods and validations to objective\_lens\_diameters and and magnifications 
    ... 
end 

class Magnification < ProductAttribute 
    ... 
    methods and validations unique to magnifications. 
    ... 
end 

class ObjectLensDiameter < ProductAttribute 
    ... 
    methods and validations unique to object lens diameters 
    ... 
end 

class Product < ActiveRecord::Base 
    has_one :magnification 
    has_one :objective_lens 

    define_index do 
    has magnification(:value), :type => :float, :as => :magnification 
    has objective_lens(:value), :type => :float, :as => :objective_lens_diameter 
    end 
end 

您可能需要到迁移带来的ProductAttributes表内联现有的键值用什么STI期望的那样。

+0

搜索中的nils是为了简化代码,并且发送的nils会将所有结果返回。 如果我能够定位特定属性以按这些属性进行过滤,那我可以使用has_many:product_attributes。 – Vizjerai 2009-10-16 14:18:15

0

我想了一个办法,直到sql_query关联得到修复。性能比使用左连接更差,但同时它减少了使其工作所需的外部代码量。

因此,定义索引更改为使用SQL片段直接获取特定列,而不是依赖任何联接。

define_index do 
    has "(SELECT `value` " + 
    "FROM `product_attributes` " + 
    "WHERE `product_id` = `products`.`id` " + 
    " AND `key` = 'Magnification' " + 
    "LIMIT 0, 1)", 
    :type => :float, 
    :as => :magnification 
    has "(SELECT `value` " + 
    "FROM `product_attributes` " + 
    "WHERE `product_id` = `products`.`id` " + 
    " AND `key` = 'Objective Lens Diameter' " + 
    "LIMIT 0, 1)", 
    :type => :float, 
    :as => :objective_lens_diameter 
end 

生成sql_query

SELECT `products`.`id` * 2 + 1 AS `id`, 
    `products`.`id` AS `sphinx_internal_id`, 
    123456789 AS `class_crc`, 
    IFNULL('987654321', 0) AS `subclass_crcs`, 
    0 AS `sphinx_deleted`, 
    (SELECT `value` 
    FROM `product_attributes` 
    WHERE `product_id` = `products`.`id` 
     AND `key` = 'Magnification' 
    LIMIT 0, 1) AS `magnification`, 
    (SELECT `value` 
    FROM `product_attributes` 
    WHERE `product_id` = `products`.`id` 
     AND `key` = 'Objective Lens Diameter' 
    LIMIT 0, 1) AS `objective_lens_diameter` 
FROM `products` 
WHERE `products`.`id` >= $start 
    AND `products`.`id` <= $end 
GROUP BY `products`.`id` 
ORDER BY NULL 
0

我固定它用短切的方法,不能确定它是否是好或不...我定义的第三个关系,即既包括我前面定义的关系只是为了在define_index方法中进行搜索和使用。你可以在这里看到我的关系 - http://stackoverflow.com/questions/15791007/thinking-sphinx-search-for-different-conditions-from-the-same-join-table/15804611#15804611

相关问题