Rails新手 - 我错过了一些非常明显的东西吗?

时间:2012-01-31 11:04:23

标签: ruby-on-rails ruby ruby-on-rails-3

相当有经验,但自学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 %>

帮助!!

提前非常感谢。

赖安

3 个答案:

答案 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添加为数据库的迁移/部分。