在 Rails3 上使用"has_many :through"关系时出现未定义的方法错误



我正在做一个使用RoR服务器的小型Android项目。以下是三个模型:

class User < ActiveRecord::Base
      has_many :relations
      has_many :friends, :through => :relations
      attr_accessor :friend_ids
end
class Relation < ActiveRecord::Base
   belongs_to :user
   belongs_to :friend
end
class Friend < ActiveRecord::Base
   has_many :relations
   has_many :users, :through => :relations
end

class CreateUsers < ActiveRecord::Migration
 def self.up
create_table :users do |t|
  t.string :user_name
  t.string :password
  t.integer :city_id
  t.integer :travelstyle_id
  t.boolean :online
  t.string :self_description
  t.string :sex
  t.integer :head_id
  t.timestamps
end

结束
def self.down
  drop_table :users
end

结束
 class CreateFriends < ActiveRecord::Migration
 def self.up
create_table :friends do |t|
  t.string :user_name
  t.integer :city_id
  t.integer :travelstyle_id
  t.string :self_description
  t.string :sex
  t.integer :head_id
  t.timestamps
end

结束
  class CreateRelations < ActiveRecord::Migration
def self.up
create_table :relations do |t|
  t.integer :user_id
  t.integer :friend_id
  t.timestamps
end

结束

Model User使用Model Relation连接Model Friend。我使用scaffold创建了三个模型,并在它们的模型文件中添加了关系代码。我还创建了一个API控制器来发送xml文件到Android应用程序。下面是控制器代码:

def find_friend
  @user=User.where("id=?",params[:id])
  @friend=@user.friends
respond_to do |format|
  format.html
  format.xml
end

结束

这里是问题,当我使用api(在http://localhost:3000/api/find_friend/1.xml中输入),服务器抛出一个错误:

NoMethodError in ApiController#find_friend
undefined method `friends' for #<ActiveRecord::Relation:0x3478a28>
app/controllers/api_controller.rb:21:in `find_friend'

我是Rails的新手,不知道错误在哪里。我需要在"路线"中添加一些东西吗?还是更改迁移文件?

在rails控制台模式下,我输入"user= user. find(1), friend=user.friends"并得到正确的结果。

~~~~(>_<)~~~~问题是控制器方法"@user=User.where("id=?",params[:id])"。where方法无法判断结果是一个数组还是一个对象。如果我使用"@user=User.find(params[:id])",rails将"足够聪明"地知道"哦,是的,这只是一个对象,它有一个名为Friends的方法,因为有人将两个模型连接在一起"。学习Rails就像一场婚姻,你以为你很了解她,但有时你会想"天啊,其实我对那个神秘的家伙一无所知。"

相关内容

  • 没有找到相关文章

最新更新