2014-07-23 16 views
1

我正在做有三个模型对象,TeamUsersMember一个应用程序,MemberTeamUsers之间的连接表。所以每个Team可以有许多成员,并且每个User可以是多个团队的成员。的Rails 4.1 - 思维 - 狮身人面像搜索与许多一对多通过关系

的关系是这样的:

# 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索引操作(其中我执行搜索) - 看起来是这样的:

def index 

    @team = Team.find_by_id(params[:team_id]) 
    @users = @team.users.search(params[:search], :page => params[:page], :per_page => 10) 

end 

我已签,球队实际上有用户,但@用户总是返回0.任何想法,我应该怎么做,使其工作,因为我想?

更新

我使用的Rails:4.1.4 和思维,sphink:3.1.1

我的狮身人面像查询看起来是这样的:

Sphinx Query (0.7ms) SELECT * FROM `member_core` WHERE MATCH('Anders') AND `team_id` = 2 AND `sphinx_deleted` = 0 LIMIT 0, 10 

狮身人面像搜索到0

随着控制器代码略有更新:

@members = @team.members.search(params[:search], :page => params[:page], :per_page => 10) 
+0

你可以看看Rails日志并找出正在创建的相应SphinxQL查询吗? – pat

+0

另请参阅:哪些版本的Rails和Thinking Sphinx正在使用? – pat

+0

@pat我已更新我的问题,并希望能回答你的问题。 – Anders

回答

1

所以,这个问题的原因是有一个搜索查询被提供,但没有匹配的字段。添加字段固定,这是很好的。

上述注释中提到的第二个问题是,当您搜索电子邮件地址时,会引发查询错误。这是因为@字符表示查询中的字段名称(用于限制对特定字段的搜索 - 例如"@name Anders"可在名为字段的字段内搜索Anders)。

你有两种方法可以解决这个问题......或者你通过将查询包装到ThinkingSphinx::Query.escape(params[:query])中,或者如果你正在寻找一个特定的电子邮件地址,那么我会建议使用ActiveRecord(因为你几乎可以肯定将对数据库中的电子邮件地址有一个唯一的约束,因此应该只有零个或一个匹配的记录)。后一种方法也意味着不需要将电子邮件作为索引字段,如果您允许任何人通过参数定义您的搜索查询,则该字段会更安全一些。让某人搜索'gmail'并且他们通过Gmail地址找回所有用户可能不是一个明智的想法。

+0

谢谢,如果我使用它,我应该在哪里放置'ThinkingSphinx :: Query.escape(params [:query])'?如果我把它添加到我的控制器中:'@members = Member.search ThinkingSphinx :: Query.escape(params [:search]),:with => {:team_id => @ team.id}',那么我得到以下错误:'未定义的方法'gsub'为零:NilClass.' – Anders

+0

通过添加if语句来检查上面的注释是否存在搜索参数。谢谢@pat! – Anders

相关问题