Rails 请教 Model 中一对多的定义和 View 中的循环嵌套输出?

hunkguo · 2013年03月05日 · 最后由 Probe 回复于 2013年03月07日 · 3086 次阅读

通过 has_many 和 belongs_to 定义了 model,在 Controller 查出所有 ProductSeller,并想查出 ProductSeller 下对应的 ProductBrand,在 view 中应该如何写? <%@productseller.each do |s| %> 输出正常,<%@productseller.productbrands.each do |b|%> 提示

undefined method `productbrands' for #<Array:0x007fa65c643d18>?
class ProductSeller < ActiveRecord::Base
  has_many :productbrands
  attr_accessible :name, :url
end

class ProductBrand < ActiveRecord::Base
  belongs_to :productseller
  attr_accessible :name, :url
end

@productseller = ProductSeller.all()

@productseller 取到的是一个‘数组’啊,当然就没有那个方法

<% @productsseller.each do |s| %> <% s.productbrands.each do |p| %> <%=# your code there ... %> <% end %> <% end %> (没测试,大概就这个意思吧)

错误:uninitialized constant ProductSeller::Productbrand

按楼上的写法也试过,同样有问题。 <%@productseller.each do |s| %>

<%s.productbrands.each do |b|%>
  • <%=b.name%>
  • <%end%> <%end%>

    ProductBrand 对应的应该是 product_brand 吧。。。

    #3 楼 @NonTwitter 这是 ProductSeller 的定义,其中的 has_many 是 productbrands class ProductSeller < ActiveRecord::Base has_many :productbrands attr_accessible :name, :url, :productbrands end

    应该这么写 has_many :product_brands

    rails 里的名称习惯应该是 ProductSeller 对应的 product_seller 这样才对,而且数组一定要加 s,比如@product_sellers,否则会和单体资源混淆

    #5 楼 @NonTwitter

    product_brands 表中没有 product_seller_id 这一列,只有 ProductSeller_id 表。 has_many 对名称的定义有啥要求,感觉不太明白,一直走弯路,似乎有 rails 自己的命名规范和习惯。

    错误 Mysql2::Error: Unknown column 'product_brands.product_seller_id' in 'where clause': SELECT product_brands.* FROM product_brands WHERE product_brands.product_seller_id = 1

    你要去手动加 product_seller_id 这一列。。。所谓的外键

    #8 楼 @NonTwitter 可以了,请问下为什么? 定义 has_many 时有啥特别要求需要注意?实在不明白,教程中大都说明了怎么做,却没多解释,我起初以为是根据自己需要来定义的?

    不规范的命名是出错的罪魁祸首,Rails 的很多东西都是靠规范的命名来实现的 楼主看的是那个教程?

    #9 楼 @hunkguo

    必须顺着 Rails 的风格来写,命名为 :product_brands,如果一定要用 :productbrands 这个名字,那么就是

    has_many :productbrands, :class_name => "ProductBrand"
    

    甚至可以是

    has_many :blablas, :class_name => "ProductBrand"
    

    但这样就很难看。

    Rails 的命名风格,我觉得下面这篇挺好的 http://ihower.tw/rails3/environments-and-bundler.html 文章挺长,看后面“名稱慣例”那一节。

    我也弄不明白 has_many 这个东西,今天正好看见这一篇,讲的是自我引用的关联,里面好多 has_many 的用法,现在终于明白些了 T_T http://cn.asciicasts.com/episodes/163-self-referential-association

    #11 楼 @Probe 请问下生成 model 时,外键表 ID 是该生成为 int 型还是用 references? 我是用 references,表中的外键 ID 也是自动生成的。

    #12 楼 @hunkguo

    觉得是两种都行 t.integer :category_idt.references :category 这两个我没看出差别。

    需要 登录 后方可回复, 如果你还没有账号请 注册新账号