通过这些关联,只有放大结果会返回正确的结果,但是当我尝试搜索第二个关联时,它将返回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,Thinking-Sphinx作为插件v1.2.12和Sphinx 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 :(得分:1)
您可以在sql_query
内分享为您的商品模型生成的development.sphinx.conf
吗?实际上,您正在做的事情应该适用于这两个属性,因此可能是生成的SQL命令中存在错误。
答案 1 :(得分:0)
狮身人面像的东西大多是正确的。搜索中的nils是多余的。但老实说,我认为这不会导致你的问题。
我认为您的问题源于您的模型关系。特别是你的单表继承(STI)的黑客攻击版本,以及Sphinx处理索引的方式。
您似乎在尝试复制索引,因此忽略了第二个索引。
我不完全确定如何修复它,添加对define_index块的查询不起作用,因为所有where语句都适用于之后定义的所有索引,并且不能被覆盖,只能添加到。思考sphinx也无法在模型上使用多个索引,因此无法通过重新定义define_index块来修复它。
Thinking-Sphinx 1.2提供Sphinx Scopes,您可能希望将其视为潜在的解决方案。不幸的是,它的记录很差,所以我不知道它是否会起作用。
鉴于Thinking-Sphinx STI和“单表继承”的谷歌搜索缺乏点击率。我希望重新定义你的关系,让铁路处理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预期的内容一致。
答案 2 :(得分: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
答案 3 :(得分:0)
我使用快捷方法修复它,不确定它是否正常...我定义了第三个关系,包括我之前为了搜索而定义的关系,并在define_index方法中使用了它。你可以在这里看到我的关系 - http://stackoverflow.com/questions/15791007/thinking-sphinx-search-for-different-conditions-from-the-same-join-table/15804611#15804611