Rails 3 - 关联
Posted
技术标签:
【中文标题】Rails 3 - 关联【英文标题】:Rails 3 - associations 【发布时间】:2011-09-15 13:46:15 【问题描述】:在我看来,我打印了一个数字,告诉我有多少人阅读了我的文章。它看起来像:
<%=article.hits.count%>
可以看出,我创建了一个简单的关联。
现在我正在尝试获取信息,如果用户在我的页面上登录,那么如果他已经阅读过这篇文章。在我的包含hits
的表中是列user_id
。
但是还是找不到路,怎么弄……
我尝试了类似的方法:
<% if session[:login_user_id].hits.user_id == session[:login_user_id]%>
Have you read it already.
<% end %>
但是上面的例子对我不起作用......有人可以帮我吗,怎么办?
编辑:模型:
class Article < ActiveRecord::Base
has_many :hits
end
class Hits < ActiveRecord::Base
belongs_to :article, :class_name => "DataHit", :foreign_key => "article_id"
has_many :users
end
class User < ActiveRecord::Base
belongs_to :hit
end
提前致谢
【问题讨论】:
能否请您添加模型及其关系,至少与问题有关的模型?我们需要模型Article
、Hit
和User
以及它们之间的关系。还是user_id直接存储在模型Hit
中没有关系?
【参考方案1】:
我们先来说说你喜欢接收的型号。对我来说,这听起来像:
每篇文章都可以被许多用户访问/阅读。 每个用户都可以阅读/访问许多文章。 这是一个经典的n:m
-association,通常由 has-many-through 关联实现。
如果是这样的意图,它应该像这样实现:
class Article < ActiveRecord::Base
has_many :hits
has_many :users, :through => :hits
end
class Hits < ActiveRecord::Base
belongs_to :article, :class_name => "DataHit", :foreign_key => "article_id"
belongs_to :user
end
class User < ActiveRecord::Base
has_many :hits
has_many :articles, :through => :hits
end
当然,您必须添加迁移以确保最终的数据库模型是这样的:
Hit 有 article_id 和 user_id 确保用户可以找到他们读过的文章如果您实现了该模型,它应该会更容易。然后您可以使用以下操作:@article.users.contains(User.find(user_id))
。请查看Ruby on Rails Guides 的教程,其中解释了 has-many-through 关系是什么以及它们具有哪些优势。
如果您先在 Rails 的控制台中尝试这些东西会很有帮助。为此,请从:
-
在应用程序的根目录中启动 rails 控制台:
rails c
在此处输入例如:art = Article.find(1)
以获取具有 id 的文章。
试试哪些方法可用:art.methods.sort
查看所有可用的方法。如果没有方法users
,说明你的关联有问题。
尝试调用:us = art.users
并查看结果。它应该是一个特定于 rails 的对象,一个行为类似于集合并了解如何向该集合添加和删除用户的对象(具有 rails 的整个生命周期)。您当前遇到的错误可能意味着不同的事情:
您的数据库模型与 Rails 中定义的关联不匹配(我怀疑)。
一些小调整(某处拼写错误)阻碍了 Rails。
我希望这能给你一些线索,下一步该怎么做,我认为我们不能一劳永逸地解决这个问题。
【讨论】:
感谢您的解释。我试图将你的笔记应用到我的应用程序中,但我仍然收到一个错误undefined method
contains' for #<0x1082c9440>
0x1082c9440>以上是关于Rails 3 - 关联的主要内容,如果未能解决你的问题,请参考以下文章