Rails 3-アソシエーション

associations model ruby-on-rails-3 view
Rails 3-アソシエーション

私の見解では、私の記事を読んでいる人の数を教えてくれます。 次のようなものです:

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

前もって感謝します

  0  1


ベストアンサー

最初に、受け取りたいモデルについて話しましょう。 私にとっては、次のように聞こえます:

  • すべての記事は多くのユーザーが閲覧/閲覧できます。

  • すべてのユーザーが多くの記事を読んだり訪問したりできます。

  • これは古典的な `n:m`の関連付けであり、通常は以下によって実装されます
    多対多の関連付け。

これが意図である場合、次のように実装する必要があります。

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

もちろん、最終的なDBモデルが次のようになるように移行を追加する必要があります。

  • ヒットには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のライフサイクル全体)。 現在発生しているエラーは、さまざまな意味がある可能性があります。

    • データベースモデルがRailsで定義された関連付けと一致しません
      (私は疑っています)。

    • Railsを妨げる若干の微調整(どこかでスペルミス)。

これが次に何をすべきかの手がかりを与えてくれることを望みます。ここで問題を一度もすべて解決できるとは思いません。

1


タイトルとURLをコピーしました