1

由于得到一个属性,我以下结构:Rails3中has_and_belongs_to_many - 错误从连接表

class A < ActiveRecord::Base 
    has_and_belongs_to_many :bs, :class_name => "B", :join_table => "ab" 
end 

class AB < ActiveRecord::Base 
    #ab has a date column "creation_date" 
    #ab also has a text column "creatior" 
end 

class B < ActiveRecord::Base 
end 

我成功地检索 “CREATION_DATE” 属性中rails console

console> A.find(1).bs.first.creation_date 
     => "14/08/1874" 

在控制器

@a = A.find(1) 
@bs = a.bs 

但在视图(部分)中使用它,我得到以下错误

bs.each do |b| 
    b.b_attribute #this is O.K. 
    b.creation_date # cause error => undefined method `creation_date` for #<B:...> 
end 

# also try to debug in partial 
A.find(1).bs.first.creation_date #=> this return data correctly 

如上图所示的问题,什么都可能导致undefined method而直接的属性仍然可以访问。

任何人都知道我的代码有什么问题?

回答

2

当你处理中间模型时,你不应该使用has_and_belongs_to_many。该方法仅适用于连接表为而非的模型。您需要明确区分模型的概念。在rails中,你很少有权访问基础表,大多数情况下你处理包装模型。

如果您的连接表有比AB更多的外键,并且您需要访问该附加数据,那么它需要是一个模型。就你而言,这是,但你没有使用正确的关系。它应该是这样的:

class A < ActiveRecord::Base 
    has_many :abs 
    has_many :bs, :through => :abs 
end 

class AB < ActiveRecord::Base 
end 

class B < ActiveRecord::Base 
end 

之后,访问creation_datecreator应通过AB模型来完成的,因为它确实是属于它的属性。

快来看看这里的例子:http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many