思考Sphinx - RuntimeError:缺少外键属性

时间:2009-04-28 17:43:49

标签: ruby-on-rails ruby sphinx thinking-sphinx

第一次尝试与Sphinx / Thinking Sphinx相处。

我的模型定义如下(简化):

class Branch < ActiveRecord::Base
  has_many  :salesmen, :class_name => "User"
  has_many :leads, :through => :salesmen
end

class User < ActiveRecord::Base
  belongs_to :branch
  has_many :leads, :foreign_key => "owner_id"
end

class Lead < ActiveRecord::Base
  belongs_to :owner, :class_name => "User"

  define_index do
    indexes company_name    
    indexes :name, :sortable => true
    has owner.branch_id, :as => :branch_id
    indexes [owner.last_name, owner.first_name], :as => :owner_full_name, :sortable => true 
  end

end

我随时打电话

Branch.first.leads.search

我得到了

RuntimeError: Missing Attribute for Foreign Key branch_id

我做错了什么?

3 个答案:

答案 0 :(得分:3)

问题在于思考Sphinx需要branch_id作为索引中的属性,因此它可以将结果限制为相关分支(因为您在关联中搜索)。

您的关联(或者可能只是我对睡眠的迫切需求)并不清楚导线是通过所有者属于分支,还是直接属于分支。如果是前者,本的建议可能是正确的。否则,请尝试将以下内容添加到define_index块中:

has branch_id, :as => :direct_branch_id

在阅读评论之后,另一种方法是将您自己的搜索方法添加到Branch中的潜在客户关联。一个模糊的尝试(你需要调试,我敢肯定):

has_many :leads, :through => :salesmen do
  def search(*args)
    options = args.extract_options!
    options[:with] ||= {}
    options[:with][:branch_id] = proxy_owner.id
    args << options
    Lead.search(*args)
  end
end

这应该绕过这样一个事实,即你没有直接引用Lead的分支。唯一可能的问题是我不确定在Thinking Sphinx注入之前或之后是否加载了自定义扩展。试一试,看看是否有帮助。

答案 1 :(得分:0)

我相信你错过了一个关于你的分支关系的选项。尝试更新到:

class Lead < ActiveRecord::Base
  has_one :branch, :through => :owner

答案 2 :(得分:0)

如果你说一个分支机构belongs_to,那么你必须在潜在客户表中有一个branch_id。既然你没有,那就不是belongs_to关系。我想你需要这样的东西:

class Branch < ActiveRecord::Base
  has_many :leads, :through => :salesmen
  has_many :salesmen, :class_name => "User" 
end

class User < ActiveRecord::Base
  belongs_to :branch # users table has branch_id
  has_many :leads, :foreign_key => "owner_id"
end

class Lead < ActiveRecord::Base
  belongs_to :owner, :class_name => "User" # leads table has owner_id

  define_index do
    indexes :company_name    
    indexes :name, :sortable => true
    has owner.branch_id, :as => :branch_id
    indexes [owner.last_name, owner.first_name], :as => :owner_full_name, :sortable => true 
  end

end