私のRails 3プロジェクトでは、followモデルを使って自己参照結合を持つユーザモデルを用意しています。この結合表を使用して、フォローしているユーザーに関連するアクティビティを検索します。私はジョインによって生成されたクエリがジョインモデルの:primary_keyオプションを完全に無視していることを除いて、ほとんど全てが正しく設定されています。ここでhas_many:through:joinテーブルのprimary_keyが動作しない
は、関連するモデルに関連するスキーマです:
create_table "users", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "first_name"
t.string "last_name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "follows", :force => true do |t|
t.integer "user_id"
t.integer "followed_user_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "activities", :force => true do |t|
t.integer "user_id"
t.text "body"
t.datetime "created_at"
t.datetime "updated_at"
end
は、ここのモデルで団体
class User < ActiveRecord::Base
has_many :follows
has_many :followed_users, :through => :follows
has_many :followed_activities, :through => :follows
has_many :activities
end
class Follow < ActiveRecord::Base
belongs_to :user
belongs_to :followed_user, :class_name => "User"
has_many :followed_activities, :primary_key => :followed_user, :foreign_key => :user_id, :class_name => "Activity"
end
だけで結構以下の作業です。しかし
u = User.first
u.follows # returns corresponding records from the follows table
u.followed_users # returns all users that u is following
u.followed_users.first.activities # returns all activity records corresponding to the first person the user is following
Follow.first.activities # same as the previous
、以下は空の配列を返します:
ここでu.followed_activities
210は、最後の文から生成されたSQLです:主キーとしてfollows'.id」の使用に参加しようとしているので、それが機能していない理由がある
Activity Load (0.2ms) SELECT `activities`.* FROM `activities` INNER JOIN `follows` ON `activities`.user_id = `follows`.id WHERE ((`follows`.user_id = 1))
むしろ「フォロー」より。フォローされたユーザー。
これはバグですか、または、ユーザーモデルのどこかで:primary_key宣言を繰り返す必要がありますか?私は、Railsのapiやどこにいてもどこの言葉も見つけられません。
Railsのバージョン:3.0.7
2つのモデルで「後続アクティビティ」を持つのは良い点です。私はhas_manyを取得する方法を見つけることができる唯一の方法だったので、フォローモデルに関連付けを入れました:働くための関連付け(私はソース宣言をここで動作させることができませんでした)。あなたが言及したように、それをアソシエーションブロックで動作させる方法を工夫しようとしています。私は何をブロックの中に入れますか?ファインダー法? – Justin
はい、配列を収集する場合は、ファインダメソッドまたはイテレータ。関連の中にメソッドを持つという本来の考えは、この本[Advanced Rails Recipes](http:// pragprog。com/book/fr_arr/advanced-rails-recipes) – Anatoly
私はその本を持っていたことを忘れてしまった!本の別のトリックを使用して、私は少し考えを解説しました。私はコメントの中でこれを行う方法を理解できないので、あなたの投稿を少し更新しました。 – Justin