嗨,全部
我需要找朋友活动:
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 :(得分: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}))
}
}
我确信有一种更优雅的方式来实现这一目标,但与此同时,这应该可以完成这项工作。