0

私はacts_as_taggable_on gemを使用しています: https://github.com/mbleigh/acts-as-taggable-on

特定の投稿にタグを表示しようとしていますが、エラーがスローされます:

undefined method `tag_counts_on' for #<Array:0x007fa5d4ac3088>

意見:

<% tag_cloud @vote_feed_items.tag_counts_on(:tags).order('count desc').limit(15), %w[a b c] do |tag, css_class| %>
   <%= link_to tag.name, tag_path(tag.name), class: css_class %>
<% end %>

コントローラ:

@user = User.find(params[:id])
@vote_feed_items = @user.vote_feed

ユーザーモデル:

def vote_feed
  Micropost.unscoped.from_microposts_voted_for_by(self)
end

マイクロポストモデル:

def self.from_microposts_voted_for_by(user)
  find_by_sql("select m.* from microposts m
        join (SELECT voteable_id, updated_at FROM votes WHERE voter_id = #{user.id} AND voteable_type = 'Micropost') z on z.voteable_id=m.id
        order by z.updated_at desc")
end

find_by_sql は配列を返していますか? もしそうなら、私はこれを別の方法で書く必要がありますか?

4

1 に答える 1

1

よくわかりませんが、関係を返すことが必要な場合は、次のようにすることができます。

def self.from_microposts_voted_for_by(user)
  results = find_by_sql("select m.* from microposts m
        join (SELECT voteable_id, updated_at FROM votes WHERE voter_id = #{user.id} AND voteable_type = 'Micropost') z on z.voteable_id=m.id
        order by z.updated_at desc")
  Micropost.where id: results.map(&:id)
end

find_by_sql は配列を返します

ActiveRecord::Relation を使用

リレーションを使用してクエリを作成できますが、モデルについてはわかりません。次のように仮定します。

class Micropost
  has_many :votes

したがって、メソッドはスコープ内のRailsとより一貫性があります。

scope(:voted_by, ->(user) do
  joins(:votes).where('votes.voter_id = ?', user.id).order('votes.updated_at desc')
end)

また、データベースに熱心にアクセスすることもありません。このスコープを次のように使用します。

@microposts = Micropost.voted_by current_user
于 2013-07-28T22:40:12.117 に答える