2009-04-28 41 views
0

第一次尝试与狮身人面像/思维狮身人面像相处融洽。思维狮身人面像 - RuntimeError:缺少外键属性

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

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

问题是思考狮身人面像需要branch_id为索引中的一个属性,因此它可以将结果限制为只相关分支(因为你是一个群内搜索)。

从您的关联(或者也许只是我非常需要睡眠)中,不管是通过所有者还是属于某个分支,还是直接也不清楚。如果前者,本的建议可能是正确的。否则,请尝试添加以下到您的define_index块:

has branch_id, :as => :direct_branch_id 

的另一种方法,阅读评论后,对自己的搜索方法添加到科引线关联。一个模糊的尝试(你需要调试,我敢肯定):

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 

这应该得到回避的事实,你没有直接引用来自铅分支。唯一可能的问题是,我不确定自定义扩展是在思考狮身人面像注入之前还是之后加载的。试试看,看看它是否有帮助。

0

我相信你在分支关系中缺少a:through选项。尝试更新到:

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

恐怕:通过不是belongs_to协会的有效选项。据我所知。 – 2009-04-28 21:07:07

+0

对不起,我的意思是改变为一个关系。现在更新我的答案! – Ben 2009-04-29 13:22:00

+0

不幸的是,由于所有者belongs_to分支并且has_one:branch,:through =>:owner不会给我任何东西,只有一个例外。 – 2009-04-29 14:31:03

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