2010-08-19 38 views
1

嗨,所有Rails3中的has_many:通過與foreign_key在一套行不通:CLASS_NAME

我需要找朋友活動:

SELECT `activities`.* FROM `activities` 
INNER JOIN `friendships` 
ON `activities`.user_id = `friendships`.friend_id 
WHERE ((`friendships`.user_id = 1)) 

我這個代碼添加到用戶模型:

has_many :friends_activities, 
     :class_name => 'Activity', 
     :through => :friendships, 
     :foreign_key => :user_id, 
     :source => :friend 

但是Rails回報是:

SELECT `activities`.* FROM `activities` 
INNER JOIN `friendships` 
ON `activities`.id = `friendships`.friend_id 
WHERE ((`friendships`.user_id = 1)) 

我需要:

`activities`.user_id = `friendships`.friend_id 

但現在:

`activities`.id = `friendships`.friend_id 

PS:我的表:

create_table "activities", :force => true do |t| 
    t.integer "user_id" 
    t.integer "target_id" 
    t.string "target_type" 
    t.string "verb" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

create_table "friendships", :force => true do |t| 
    t.integer "user_id", :null => false 
    t.integer "friend_id", :null => false 
    t.string "state" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 
+0

什麼版本的Rails3是RC或是beta版本 – 2010-08-19 03:32:31

+0

發佈您的搜索查詢 – Bohdan 2010-08-19 09:11:05

回答

0

我不確定你可以在has_many上使用其他選項:通過。根據to the docs

指定通過其執行查詢的關聯。這可以是 是任何其他類型的關聯,包括其他:通過 關聯。 選項:class_name,:primary_key和:foreign_key 將被忽略,因爲該關聯使用源反射。

[重點煤礦]

0

你的最後一招可能是:

has_many :friends_activities, 
     :class_name => 'Activity', 
     :finder_sql => Proc.new { 
      %Q{ 
       SELECT `activities`.* FROM `activities` 
       INNER JOIN `friendships` 
       ON `activities`.user_id = `friendships`.friend_id 
       WHERE ((`friendships`.user_id = #{id})) 

       } 
      } 

我敢肯定有一個更優雅的方式來實現這一目標,但在此期間本應做的工作。