Rails3 has_many:through和foreign_key在set:class_name中不起作用

时间:2010-08-19 03:23:05

标签: ruby-on-rails ruby-on-rails-3

嗨,全部

我需要找朋友活动:

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

2 个答案:

答案 0 :(得分:0)

我不确定您是否可以使用has_many上的其他选项:through。根据{{​​3}}:

  

指定执行查询的关联。这个可以   是任何其他类型的协会,包括其他:通过   关联。 选项:class_name,:primary_key和:foreign_key   被忽略,因为关联使用了源反射。

[强调我的]

答案 1 :(得分: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}))

              }
          }

我确信有一种更优雅的方式来实现这一目标,但与此同时,这应该可以完成这项工作。