2012-01-31 40 views
0

非常有经验,但自学PHP/MySQL和玩Rails。真的很喜欢我用它做的事情,但是我认真对待我脑海中的事情应该很简单;将来自各个表格的数据连接在一起,然后以各种视图显示。我想我明白了Active Record的概念,但我似乎无法按照自己想要的方式使其工作。Rails新手 - 我错过了真正明显的东西吗?

我正在构建一个相当复杂的音乐编目系统翼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

我可以看到你对此感到困惑。我认为你在这里错过了很多东西(例如,你应该在你的发布模型中有一个'has_and_belongs_to_many:artists'),所以我建议你不要纠正你,而是要去看看http://blog.hasmanythrough.com/。 2006/4/20 /多到许多舞蹈断。它拥有你需要的一切来推动这个 – Ashitaka 2012-01-31 11:55:58

+0

哈哈,我会说失望!它应该是简单的权利?我想我在走路前试图跑步。 感谢您的评论,我现在就去看看你的博客。 – Raoot 2012-01-31 12:47:11

+0

哦,博客不是我的。我偶然发现了它,同时学习了rails并研究了如何实现连接模型和表格,并且该站点从此一直对我非常宝贵。它非常好,它解释了使用'HABTM'关系和'has_many:through'关系(我认为是你想要的)之间的主要区别。 – Ashitaka 2012-01-31 12:56:39

回答

0
Release Load (0.2ms) SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4) 

,因为你用的是产生上述查询:包括=>:协会(:你的情况发布)中找到method.This的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 DATABSE命中)

欲了解更多详情,请访问

http://guides.rubyonrails.org/active_record_querying.html

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+0

谢谢。我已将控制器更改为使用 @products =产品(:全部) 但是,我现在为我的产品控制器获得了未定义的方法'Product':( – Raoot 2012-01-31 12:45:05

+0

更改为@products = Product.all并清除了该错误: - ) – Raoot 2012-01-31 12:49:57

+0

我也更新了答案。感谢您的通知。 – 2012-01-31 12:57:39

0

的问题是:

我试过下面却得到了一个 'NoMethodError'标题:

根据他的代码

<td><%= product.title %></td> 

我想知道,如果你错过了你的“产品”表中的“标题”一栏,我建议你应该检查你的表的结构,以确保该列存在。

+0

标题栏位于发布表......我基本上想要设置主发布版,然后每个产品都是发布版的变体......所以主发布版会是“黑暗”例如,我将添加变体或产品,每个变体或产品都按格式/目录编号/发布日期等进行标识。 – Raoot 2012-01-31 12:40:07

+0

请参阅我的更新答案。 – 2012-02-01 08:09:15

0

也许在您的控制台中尝试"rake db:migrate"以更新您的数据库。如果您已经生成了产品模型,但没有记住迁移数据库,则该表不会在数据库中。您可能也忘记将product.title添加为数据库的迁移/部分内容。

相关问题