相当有经验,但自学PHP / MySQL和玩Rails。真的很喜欢我到目前为止所做的事情,但我正在认真思考应该是非常简单的事情;将来自各种表的数据连接在一起,然后在各种视图中显示它。我想我得到了Active Record的概念,我似乎无法以他想要的方式工作。
我正在努力构建一个相当复杂的音乐编目系统ala Discogs,包括艺术家,发行版,产品,曲目和标签级别,并具有以下模型:
class Artist < ActiveRecord::Base
has_and_belongs_to_many :releases
end
class Release < ActiveRecord::Base
has_many :products
end
class Product < ActiveRecord::Base
belongs_to :release
has_many :tracks
end
class Tracks < ActiveRecord::Base
has_and_belongs_to_many :products
end
最终,我想介绍地区,销售和其他数据,但在我掌握上述基础知识之前,我无法移动fwd。
在我的产品控制器中,我有:
@product = Product.find(:all, :include => :release)
产生:
Processing by ProductsController#index as HTML
Product Load (0.1ms) SELECT "products".* FROM "products"
Release Load (0.2ms) SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4)
但我认为如果我的关联是正确的话,这可能是不必要的?
例如,在我的产品视图中,我想列出从版本表中提取标题的产品。我尝试了以下内容,但在标题上得到了“NoMethodError”:
<% @product.each do |product| %>
<tr>
<td><%= product.title %></td>
<td><%= product.cat_no %></td>
<td><%= product.barcode %></td>
<td></td>
</tr>
<% end %>
帮助!!
提前非常感谢。
赖安
答案 0 :(得分:0)
Release Load (0.2ms) SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4)
生成上述查询是因为您在find方法中使用了:include =&gt;:association(在您的情况下为release)。这个Rails的属性被称为渴望加载广泛用于性能优化。没有问题在你的协会中我认为。
如果您已经使用过
@products = Product.all
并在您的视图页面
<% @product.each do |product| %>
<tr>
<td><%= product.title %></td>
<td><%= product.cat_no %></td>
<td><%= product.barcode %></td>
<td><%= product.release.name %></td>
</tr>
<% end %>
方法调用product.release将为循环执行的'n'次数创建上述查询。(n数据库命中)
如果你使用:include选项,这可以避免.Rails预加载相关的关联(:release)。(只有1个数据库命中)
有关详细信息,请访问
http://guides.rubyonrails.org/active_record_querying.html
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
答案 1 :(得分:0)
我尝试了以下内容,但在标题上获得了“NoMethodError”:
根据他的代码:
<td><%= product.title %></td>
我想知道您是否错过了“产品”表中的“标题”列,我建议您检查表的结构以确保此列存在。
答案 2 :(得分:0)
也许在控制台中尝试"rake db:migrate"
来更新数据库。如果您已生成产品模型,但未记住要迁移数据库,则该表将不在数据库中。您可能也忘记将product.title添加为数据库的迁移/部分。