鉴于我有以下结构:
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
我成功检索了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
的问题。
任何人都知道我的代码有什么问题?
答案 0 :(得分:2)
当您处理中间模型时,不应使用has_and_belongs_to_many
。仅当连接表不模型时,该方法才有效。您需要明确区分模型和表的概念。在rails中,您很少能够访问基础表,通常是处理包装模型。
如果您的联接表包含的内容超过A
和B
的外键,并且您需要访问其他数据,那么它需要是一个模型。在你的情况下,它是,但你没有使用正确的关系。它应该是这样的:
class A < ActiveRecord::Base
has_many :abs
has_many :bs, :through => :abs
end
class AB < ActiveRecord::Base
end
class B < ActiveRecord::Base
end
之后,访问creation_date
和creator
应该通过AB
模型完成,因为它确实是属于它的属性。
请点击此处查看示例的快速说明:http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many