Рельсы 3 - ассоциации - PullRequest
       14

Рельсы 3 - ассоциации

0 голосов
/ 15 сентября 2011

Я печатаю, на мой взгляд, число, которое говорит мне, сколько людей прочитало мою статью. Это выглядит примерно так:

<%=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

Заранее спасибо

1 Ответ

1 голос
/ 15 сентября 2011

Давайте сначала поговорим о модели, которую вы хотели бы получить.Для меня это звучит так:

  • Каждая статья может быть посещена / прочитана многими пользователями.
  • Каждый пользователь может прочитать / посетить много статей.
  • Этоклассическая n:m -ассоциация, которая обычно реализуется ассоциацией 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 , в котором объясняется, что такое отношение "есть много сквозных" и какие у них есть преимущества.

Было бы полезно, если вы попробуете сначалав консоли Rails.Для этого начните с:

  1. Запустите консоль rails в корневом каталоге вашего приложения: rails c
  2. Введите там, например: art = Article.find(1), чтобы получить статью сid.
  3. Попробуйте, какие методы доступны: art.methods.sort, чтобы увидеть все методы, которые можно использовать.Если нет метода users, вы сделали что-то не так с ассоциированием.
  4. Попробуйте позвонить: us = art.users и посмотрите на результат.Это должен быть специфичный для рельсов объект, объект, который ведет себя как коллекция и понимает, как добавлять и удалять пользователей в эту коллекцию (со всем жизненным циклом рельсов).Ошибка, которую вы сейчас имеете, может означать разные вещи:
    • Ваша модель базы данных не соответствует вашим ассоциациям, определенным в Rails (я подозреваю, что).
    • Некоторая незначительная настройка (где-то неправильно), которая мешает Rails.

Я надеюсь, что это даст вам некоторые подсказки, что делать дальше, я не думаю, что мы сможем решить проблему здесь раз и навсегда.

...