1

在Ryan Bates 的 Railscast的帮助下,我正在尝试使用 Tokeninput 设置一个搜索即输入的表单。不幸的是,我无法通过自引用关联来解决这个问题。

在我的模型中:

class Skill < ActiveRecord::Base
  attr_accessible :skill_relationship_attributes, :prereq_tokens
  attr_reader :prereq_tokens

  has_many :skill_relationships
  has_many :prereqs, :through => :skill_relationships
  has_many :inverse_skill_relationships, :class_name => 'SkillRelationship', :foreign_key => "prereq_id"
  has_many :inverse_prereqs, :through => :inverse_skill_relationships, :source => :skill

  accepts_nested_attributes_for :skill_relationships, :allow_destroy => true

  def prereq_tokens=(ids)
    self.prereq_ids = ids.split(",")
  end
end

class SkillRelationship < ActiveRecord::Base
  attr_accessible :skill_id, :prereq_id, :skill_attributes, :prereq_attributes

  belongs_to :skill
  belongs_to :prereq, :class_name => 'Skill'
end

我无力地整理了一个表格:

<%= form_for skill do |f| %> 
  <%= f.label :prereq_tokens, "Prerequisites" %><br/>
  <%= f.text_field :prereq_tokens, data: {load: Skill.all} %>       
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我确实得到了一个样式精美的文本字段,但它在搜索时找不到任何东西,而且我不确定从这里去哪里。有任何想法吗?

4

1 回答 1

0

我想出了这个!首先,我从表单中删除了“data: {load: Skill.all}”,因为我希望它通过thinking_sphinx 而不是我的整个数据库工作。然后- 这是关键 - 我在我的咖啡脚本中指定了propertyToSearchqueryParam

jQuery ->
  $('#skill_prereq_tokens').tokenInput '/skills.json'
    theme: 'facebook'
    propertyToSearch: 'title' // :title is the attribute in my Skill model that I want to show up in the list
    queryParam: 'search' // :search is the parameter that gets passed to thinking_sphinx

瞧!事实证明,这更像是一个thinking_sphinx 问题,而不是与我的自我参照关联有关。

需要注意的是,使用 propertyToSearch 指定 title 属性仅确定哪个属性可以代表每个技能,并且不会阻止 thinking_sphinx 使用其索引中的其他属性。

但它的工作方式与 Facebook 输入字段不完全一样,因为 thinking_sphinx 默认只进行全词搜索。换句话说,如果我在寻找一种叫做“拳击”的技能,然后输入“box”甚至“boxin”,我什么也得不到。只有当我最终输入完整的拳击“拳击”字样时,该技能才会在列表中返回。可以将 thinking_sphinx 配置为索引前缀,这样它就会返回部分单词的结果,就像 Facebook 所做的那样 - 但如果你正在索引一个大型数据库,你可能不想这样做,因为你的索引会爆炸快疯了。这可能是 Facebook 将每个人的好友上限限制在 5000 个的重要原因,除了没有人拥有 5000 个好友这一事实。

于 2012-12-21T20:48:24.027 回答