0

検索してみましたが、何も見つかりませんでした。気をつけてください、私は間違ったものを探していたかもしれません。

それで、私の質問はRailsの結合テーブルに関するものです。

ユーザーとブック、およびユーザーをブックにリンクする結合テーブルのお気に入りを用意する予定です。

したがって、最初に考えたのは、Favorites テーブルには user_id と book_id があるということです。

ただし、提案も提供したいと思います。したがって、user1 が本 1、2、3、4 を好み、user2 が本 1、2、3、4、5 を好む場合。user1 にブック 5 を提案できるようにしたいと考えています。

user_id を含むテーブルと、お気に入りの本を含む配列を用意するのが、適切な提案を見つけるのに最も簡単だと考えています。

だから、私の質問は2つあります。まず、2 つのテーブルが必要ですか? 1 つの結合テーブルと、配列を持つテーブルの別の結合? または、これら2つは同じである可能性がありますか?第二に、これはすべてを設定するための最良の方法ですか? 私は独学なので、非常に基本的なことを見逃している可能性があります..

助けていただければ幸いです。

4

3 に答える 3

3

ですから、提案をどこにどのように表示したいのかわかりませんが、次のように言いましょう。

User、Book、Favorite クラスを次のように作成したと仮定します。

Class User < ActiveRecord::Base
   has_many :favorites
   has_many :books, :through => :favorites
end

Class Book < ActiveRecord::Base
   has_many :favorites
   has_many :users, :through => :favorites
end

Class Favorite < ActiveRecord::Base
   belongs_to :user
   belongs_to :book
end

すべてのユーザーが自分のプロフィール ページ (アクションを表示) を持っていて、あるユーザーが別のユーザーのプロフィール ページに移動するたびに、提案を表示したいとします。

提案用のテーブルを作成する必要はありません。提案を計算してユーザーに表示するためのいくつかの方法だけです。

本を提案するには、他のユーザーのお気に入りの本を少なくとも 3 冊持っている必要があるとしましょう。

あなたの User クラスで:

def suggest_books_from?(user)
     true if self.books & user.books > 3
end

それは、あなたが他のユーザーと互換性があるかどうかを確認するために交差します. 互換性がある場合、たとえば、メソッドが true を返す場合、どの本を彼に提案するかを計算する必要があるため、呼び出しは次のようになります。

if current_user.suggest_books_from?(user)
     user.books - current_user.books
end

そのメソッドは、ユーザーがお気に入りに追加したすべての書籍を含む配列を返す必要がありますが、現在のユーザーはお気に入りに追加していません

于 2013-03-12T21:02:43.083 に答える
2

最初の質問に答えるには、単一の標準的な結合テーブルを探しています。同じ情報を異なる表現で別のテーブル (または別の列) に含めると、一貫性を保つことが難しくなり、思ったほど役に立たない可能性があります。

その理由は、質問 2 に対する答えです。ここには、この作業をすべて実行してくれる本当に優れたレコメンデーション エンジンがたくさんあります。

最大のものはrecommifyですが、約1年間アクティブではありません。私はそれをプロジェクトで使用しましたが、非常に満足のいくものでした。私の経験では、高速で、結果は正確に見えます。

Recommendableは最近更新されましたが、賛成票と反対票でもより機能します。それでも、製品の「お気に入り」を賛成票として扱い、必要に応じてそのように使用することもできます.

どちらもニーズに合わない場合は、RubyToolbox のレコメンデーション エンジンのリストを確認してください。

于 2013-03-12T20:53:56.673 に答える
0

これを行う簡単な方法は、作成した結合モデル (お気に入り) を使用して ID の配列を取得することです。長い目で見ればパフォーマンスは良くないかもしれませんが、アプリの初期状態を考えると、今はシンプルに保ち、後でパフォーマンスに対処します.

したがって、その場合、次のようなものがあるとします。

class User < ActiveRecord::Base
  has_many :favorites
  has_many :books, :through => :favorites
end

class Book < ActiveRecord::Base
end

class Favourite < ActiveRecord::Base
  belongs_to :user
  belongs_to :book
end

次に、次のようにユーザーの書籍 ID を取得できます。

user = User.first
user.book_ids

本を推薦することについて話すことはできませんが、2 人のユーザーが共通していない本を確認するには、次のようにします。

frank = User.first
joe = User.last
frank.book_ids - joe.book_ids # IDs for books Frank has but Joe doesn't
joe.book_ids - frank.book_ids # IDs for books Joe has but Frank doesn't
于 2013-03-12T21:03:10.720 に答える