第一次尝试与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
我做错了什么?
答案 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