开发者

Rails 3 - associations

I print in my view a number that tell me, how many people read my article. It looks something like a:

<%=article.hits.count%>

As is possible to see, I created a simple association. Now I am trying to get the information, if the user who is log in on my page, so if he is already had read this article. In my table that contains hits is column user_id. But I can't still find the way, how to get...

I tried something like:

<% if session[:login_user_id].hits.user_id == session[:login_user_id]%>
  Have you read it already.
<% end %>

But the example above doesn't work me... Could anyone help me please, how to do?

EDIT: The models:

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

Thanks in advance


Let's first talk about the model you like to receive. For me, it sounds like:

  • Every article can be visited / read by many users.
  • Every user can read / visit many articles.
  • This is a classical n:m-association which is normally implemented by a has-many-through association.

If this is the intention, it should be implemented like:

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

Of course, you have to add migrations that ensure that the final DB model is like that:

  • Hit has article_id and user_id to ensure that users may find the articles they have read

If you have that model implemented, it should be more easy. Then you have operations available like: @article.users.contains(User.find(user_id)). Have a look at the tutorial at Ruby on Rails Guides which explain what the has-many-through relation is and which advantages they have.

It would be helpful if you try the things first in the console of Rails. To do that, start with:

  1. Start the rails console in the root directory of your application: rails c
  2. Enter there e.g.: art = Article.find(1) to get the article with the id.
  3. Try which methods are available: art.methods.sort to see all methods that could be used. If there is no method users, you have did something wrong with the assocication.
  4. Try the call: us = art.users and look at the result. It should be a rails specific object, an object that behaves like a collection and understands how to add and remove users to that collection (with the whole life cycle of rails). The error your currently have could mean different things:
    • Your database model does not match your associations defined in Rails (I suspect that).
    • Some minor tweak (misspelling somewhere) which hinders Rails.

I hope this gives you some clues what to do next, I don't think that we can fix the problem here once and for all times.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜