我正在创建一个包含三个模型对象的应用Team
,Users
和Member
,Member
是Team
和{{之间的联接表1}}。因此,每个Users
可以有许多成员,每个Team
可以是多个团队的成员。
这种关系看起来像这样:
User
我想要做的是搜索特定团队中的成员。目前我获得了# Team.rb
has_many :members
has_many :users, through: :members
# User.rb
has_many :members
has_many :teams, through: :members
个结果。
我的索引如下所示:
no
我的# user_index
ThinkingSphinx::Index.define :user, :with => :real_time do
indexes name
indexes email
indexes about
has team_id, type: :integer
has created_at, type: :timestamp
has updated_at, type: :timestamp
indexes members.team.name, :as => :teams
end
# team_index
ThinkingSphinx::Index.define :team, :with => :real_time do
indexes name
has created_at, type: :timestamp
has updated_at, type: :timestamp
indexes members.user.name, :as => :members
end
# member_index.rb
ThinkingSphinx::Index.define :member, :with => :real_time do
has user_id, type: :integer
has team_id, type: :integer
has created_at, type: :timestamp
has updated_at, type: :timestamp
end
索引操作(执行搜索的位置) - 看起来像这样:
members_controller
我已经检查过团队实际上有用户,但是@users总是返回0.有关如何使其按照我的意愿工作的任何想法?
更新
我使用Rails:4.1.4 思考 - 思考:3.1.1
我的Sphinx查询如下所示:
def index
@team = Team.find_by_id(params[:team_id])
@users = @team.users.search(params[:search], :page => params[:page], :per_page => 10)
end
Sphinx找到0结果
略微更新控制器代码:
Sphinx Query (0.7ms) SELECT * FROM `member_core` WHERE MATCH('Anders') AND `team_id` = 2 AND `sphinx_deleted` = 0 LIMIT 0, 10
答案 0 :(得分:1)
因此,此问题的原因是提供了搜索查询,但没有要匹配的字段。添加固定的字段,这很棒。
上述评论中提到的第二个问题是,当您搜索电子邮件地址时,会引发查询错误。这是因为@字符表示查询中的字段名称(限制搜索到特定字段 - 例如"@name Anders"
以搜索名为name的字段中的Anders。)
你有两种解决方法...要么通过将查询包装在ThinkingSphinx::Query.escape(params[:query])
中来逃避查询,要么你正在搜索特定的电子邮件地址,那么我建议改用ActiveRecord(给定您几乎肯定会对数据库中的电子邮件地址有唯一约束,因此应该只有零个或一个匹配记录)。后一种方法也意味着不需要将电子邮件作为索引字段,如果您让任何人通过参数定义您的搜索查询,这会更安全一些。让某人搜索' gmail'并且他们用gmail地址收回所有用户可能不是一个明智的想法。