1

だから私はレールを学ぼうとしていますが、まだチートしたくありません。

ポストモデル:

class Post < ActiveRecord::Base
    has_many :features
    has_many :tags, :through => :features
end

タグモデル:

class Tag < ActiveRecord::Base
    has_many :features
    has_many :posts, :through => :features
end

結合テーブル:

class Feature < ActiveRecord::Base
    belongs_to :tag
    belongs_to :post
end

Post.find_by_id(1) << Tag.firstを実行して、投稿をタグに関連付ける方法を既に知っています。

今、特定のタグが付いた投稿の検索に行き詰まっています。「水泳」、「ランニング」、「金儲け」のタグが 1 つ以上含まれているすべての投稿を検索するにはどうすればよいですか。

Post1 には、「サイクリング」、「ロック クライミング」、「水泳」のタグが含まれています。

Post2 includes tags: "カエル", "魚"

Post3 には、「お金を稼ぐ」、「水泳」、「サイクリング」、「愛」のタグが含まれています。

Post4 にはタグが含まれています: "水泳"

ユーザーの興味に最も合致する投稿を最初に表示したい。

例: ユーザーは、この順序で投稿のリストを表示する必要があります.... post3、post1、post4。これが難しすぎる場合は、正確なタグを持つすべての投稿を見つける方法で十分だと思います。

4

1 に答える 1

0

あなたはただできるはずです

@tag.posts

has_and_belongs_to_many関係を使用しなかった理由はありますか?

アップデート:

あなたのコメントごと:

tag_ids = [1, 2, 3] # aka the IDs for tags ["swimming", "running", "making money"]
matches = {}
@posts.each do |post|
  count = 0;
  post.tags.each do |tag|
    count += 1 if tag_ids.include? tag.id
  end
  matches[count] ||= []
  matches[count] << post
end

おそらく少し最適化される可能性がありますが、matches一致の数に応じて、要求されたタグに一致するすべての投稿がキーに含まれます。これはおそらく、コントローラーではなく、Posts モデルのクラス メソッドに入れる必要があります。

于 2011-03-03T04:38:49.753 に答える