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

提前致谢

【问题讨论】:

能否请您添加模型及其关系,至少与问题有关的模型?我们需要模型ArticleHitUser 以及它们之间的关系。还是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>

以上是关于Rails 3 - 关联的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 - 关联

Rails 3 - 关联 - 它是如何工作的?

Rails 3.2 - 在现有表单上添加新关联

Rails 3. 按关联模型排序

Rails 关联帮助 - 我是不是使用多态关联?

Rails 3:通过关联项验证是不是存在至少一个有多个