0

タグ付けシステムの実装に取り​​組んでいますが、スコープを使用してタグ付けされたオブジェクトをクエリする際に問題が発生します。

たとえば、特定のタグが付いたすべてのユーザーのアイテムを検索したいと思います。クラスメソッドを使用すると、現在すべてのオブジェクトを見つけることができます。

def self.tagged_with(name)
  Tag.find_by_name(name).items
end

ただし、これには問題があります。次のようなことをした場合:current_user.items.tagged_with(name)この既存のメソッドは、current_userが所有するアイテムだけでなく、すべてのアイテムを返しますか?これは単なるクエリの問題だと思いますが、クラスメソッドをコレクションで呼び出されるものに変更する方法がわかりません。私は反対の方法で、タグを介してコレクションを取得しようとしましたtag.items.where(:user_id => current_user.id)が、この場合、それは多対多の関係であり、これについても理解できませんでした。

このようなクエリを制限する適切な方法は何ですか?

4

2 に答える 2

1

Userクラスを指す関連付けをクラスに作成しますTag

class User < ActiveRecord::Base
  has_many :tags
end

次に、次のことができます。 current_user.tags.where(...)

関連付けがまだ行われていない場合は、移行を作成して、テーブルが外部キーでテーブルをtags参照するようにする必要があります。users

于 2013-02-19T22:41:27.597 に答える
0

これが役立つと思います:

    class Account < ActiveRecord::Base
        has_many :people do
            def find_or_create_by_name(name)
                first_name, last_name = name.split(" ", 2)
                find_or_create_by_first_name_and_last_name(first_name, last_name)
            end
        end
    end

    person = Account.first.people.find_or_create_by_name("David Heinemeier Hansson")
    person.first_name # => "David"
    person.last_name    # => "Heinemeier Hansson"

tagged_withしたがって、基本的には、メソッドを関連付けに直接定義できます。

この例は、ドキュメントActiveRecord::Associationsから取られています。

于 2013-02-19T22:55:27.357 に答える