基本的にhas_many :through
関係をモデル化しているようです: Item has_and_belongs_to_many User, and Rating is the join model. :through
関係についてはRails Guide to Active Record Associationsで読むことができます。
その場合は、次のようにモデルの関係を構築することをお勧めhas_many :through
します。
class Rating < ActiveRecord::Base
attr_accessible :item_id, :user_id
belongs_to :item
belongs_to :user
end
class User < ActiveRecord::Base
has_many :ratings
has_many :rated_items, :through => :ratings
end
class Item < ActiveRecord::Base
has_many :ratings
has_many :rated_by_users, :through => :ratings, :source => :user
end
次に、DB に次のレコードがあるとします。
$ sqlite3 db/development.sqlite3 'SELECT * FROM items';
1|2013-03-22 03:21:31.264545|2013-03-22 03:21:31.264545
2|2013-03-22 03:24:01.703418|2013-03-22 03:24:01.703418
$ sqlite3 db/development.sqlite3 'SELECT * FROM users';
1|2013-03-22 03:21:28.029502|2013-03-22 03:21:28.029502
$ sqlite3 db/development.sqlite3 'SELECT * FROM ratings';
1|1|1|2013-03-22 03:22:01.730235|2013-03-22 03:22:01.730235
次のステートメントを使用して、関連する評価およびユーザー インスタンスとともに、すべてのアイテムを要求できます。
items = Item.includes(:rated_by_users)
これにより、3 つの SQL クエリが実行されます。
Item Load (0.1ms) SELECT "items".* FROM "items"
Rating Load (0.2ms) SELECT "ratings".* FROM "ratings" WHERE "ratings"."item_id" IN (1, 2)
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (1)
#rated_by_users
また、各アイテムの関連付けメソッドを呼び出すことで、各アイテムを評価したユーザーにアクセスしようとすることができます。
> items.map {|item| item.rated_by_users }
=> [[#<User id: 1, created_at: "2013-03-22 03:21:28", updated_at: "2013-03-22 03:21:28">], []]