1

各ユーザーは多くのリソースを持つことができ、それらの各リソースには多くの投票があり、それらの各投票には、特定のユーザー リソースをすべて合計したい値属性があります。

これを構文的に間違った方法で入力するとしたら、次のようなものが必要です...

@user.resources.votes.sum(&:value)、しかし、それは明らかにうまくいきません。

使用する必要collectがあると思いますが、よくわかりませんか?

これは私が得た最も近いものですが、それらを印刷します。

<%= @user.resources.collect { |r| r.votes.sum(&:value) } %>

4

4 に答える 4

3

has_many :throughUser オブジェクトと Vote オブジェクトの間に関係を設定することをお勧めします。モデルを次のように設定します。

class User < ActiveRecord::Base
  has_many :resources
  has_many :votes, :through => :resources
end

class Resource < ActiveRecord::Base
  belongs_to :user
  has_many :votes
end

class Vote < ActiveRecord::Base
  belongs_to :resource
end

これが完了したらuser.votes、そのコレクションを呼び出して、好きなことをするだけです。

リレーションの詳細has_many :throughについては、次のガイドを参照してください: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

于 2012-05-14T05:01:27.203 に答える
2

Vote インスタンスを使用して、誰が投票したかをどのように確認できますか? Vote モデルには、voter_idフィールドと追加の関連付けが必要です。

# in Vote.rb
belongs_to :voter, class_name: 'User', foreign_key: 'voter_id'

そして、あなたの User モデルで:

# in User.rb
has_may :submited_votes, class_name: 'Vote', foreign_key: 'voter_id'

したがって、@user.votes(David Underwood が提案したように) @user リソースの投票が得られます。また@user.submited_votes、@user によって送信された投票が表示されます。

User <- Resource <- Vote リレーションのみを使用すると、一部のユーザーの投票とそのリソースに対する投票を分離することはできません。

于 2012-05-14T06:58:25.923 に答える
1

このコードを試してください

@user.resources.map(&:votes).flatten.map(&:value).sum
于 2012-05-14T05:09:06.937 に答える
1

合計の場合、これは機能するか、実際に近いものになるはずです。

sum = 0
@user.resources.each do |r|
r.votes.each do |v|
    sum += v.value
end
end

これはあなたのために働くかもしれません:

@user.resources.map {|r| r.votes.sum(:value)}.sum

いくつのレコードがありますか。これをデータベース レベルにプッシュする方法があると思います。チェックする必要があると思いますが、レコードが数個しかない場合は、Ruby でこれを実行しても問題ないでしょう。

于 2012-05-14T04:35:22.780 に答える