2

提案のリストを含むプロジェクトを含むデータモデルがあり、各提案はユーザーによって作成されます。プロジェクト内で提案を行ったすべての個別のユーザーのリストを作成する方法はありますか?

私はMongoid3を使用しています。私はこのようなことを考えていましたが、機能しません。

@project = Project.find(params[:id])
@users = Array.new
@users.push(@project.suggestions.user)  <-- this doesn't work

何か案は?これが私のモデル構造です:

class Project
  include Mongoid::Document
  has_many :suggestions, :dependent => :destroy
  ...
end

class Suggestion
  include Mongoid::Document
  belongs_to :author, class_name: "User", :inverse_of => :suggestions
  belongs_to :project
  ...
end

class User
  include Mongoid::Document
  has_many :suggestions, :inverse_of => :author
  ...
end
4

2 に答える 2

1

MongoidはMongoDBに関係の類似性を与えることができ、MongoDBは外部キーフィールドを保持できますが、これらの関係に対する基本的なサポートはありません。探していたソリューションを入手するのに役立つ可能性のあるいくつかのオプションを次に示します。

オプション1:アクセスパターンに関連するデータを非正規化する

つまり、データの一部を複製して、頻繁なタイプのクエリを効率的にするのに役立てます。これは、いくつかの方法の1つで行うことができます。

User1つの方法は、おそらくと呼ばれるに新しい配列フィールドを追加することsuggested_project_idsです。Projectまたは、と呼ばれるに新しい配列フィールドを追加することもできますsuggesting_user_ids。いずれの場合も、提案が行われるたびに、このObjectIdの配列を更新する必要があります。MongoDBは、を使用してこれを簡単にし$addToSetます。Mongoidからのクエリは、次のようになります。

User.where(suggested_project_ids: some_project_id)

オプション2:データを非正規化します(オプション1と同様)が、Mongoidに関係を管理させます

class Project
  has_and_belongs_to_many :suggesting_users, class_name: "User", inverse_of: :suggested_projects
end

class User
  has_and_belongs_to_many :suggested_projects, class_name: "Project", inverse_of: :suggesting_users
end

ここから、新しい提案が行われたときにプロジェクトへの提案ユーザーの追加を管理する必要がありますが、オブジェクト自体を使用して管理できます。Mongoidは、内部で設定されたロジックを処理します。その後、プロジェクトについて提案を行うユニークなユーザーのセットを見つけると、次のようになります。

some_project.suggesting_users

オプション3:2つのクエリを実行して、結果を取得します

各プロジェクトで提案を行うユーザーの数によっては、非正規化を実行せずに逃げることができる場合がありますが、代わりに2つのクエリを実行するだけです。

まず、プロジェクトで提案を行ったユーザーIDのリストを取得します。

author_ids = some_project.suggestions.map(&:author_id)
users = User.find(author_ids)
于 2012-08-02T15:19:26.393 に答える
0

あなたのProjectクラスにこれを追加してください:

has_many :users, :through => :suggestions

その後、次のことができるようになります。

@users.push(@project.users)

ここでより多くの情報:through

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

mongoidについては、次の回答 をご覧ください:has_manyを実装する方法:Mongoidおよびmongodbとの関係を介して?

于 2012-07-30T14:33:33.867 に答える