0

私は以下を持っています

Tag.update_counters(Tag.where(:name => name).id, :count => 1)

タグカウントをインクリメントしようとしていますが、それについて知っているのは、nameの値からの「java」または「ruby」という単語だけです。しかし、私は自分のカウンターを増やすことに失敗しました。私はincrementとincrement_counterを試してみましたが、どれも機能していないようです。キャッシュカウンターも調べましたが、この関連付けはhas_manyではなく、に属しています。代わりに、これはhas_many:throughassociationです。

私は何が間違っているのですか?これは悪いやり方ですか?ありがとう

アップデート。

私はそれを修正しました...

Tag.update_counters(Tag.where(:name => name).map(&:id), :count => 1)

誰かが理由を説明できますか

Tag.where(:name => name).name

動作しませんか?

Tag.where(:name => name)

タグハッシュを返します。.nameを呼び出すと、そのタグのname属性が取得されると思いましたか?

4

1 に答える 1

1

Tag.where(:name => name)指定されたすべてのレコードを返しますname。Railsは、このコマンドを実行する前に、この種のレコード(1000、1、または0)がたくさんあるかどうかを知りません。したがって、このステートメントはレコードのARRAYを返します。1つのレコードだけが必要な場合は、:Tag.where(:name => name).firstを使用します。結果はDBから1つのレコードになるため、この場合はそれを呼び出すことができます.name

update_counters返されたすべてのレコードからすべてのIDを取得するのに十分スマートです。このレコードに1つずつアクセスする必要がある場合は、次のように行うことができます。

Tag.where(:name => name).each do |tag|
  logger.info tag.name # now you can use .name as you are dealing with a single record
end
于 2012-04-21T07:05:19.300 に答える