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

时间:2011-04-11 14:34:13

标签: activerecord ruby-on-rails-3

我正在使用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

模型用户使用模型关联来连接模型朋友。我使用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的新手,不知道错在哪里。我是否必须在“route.rb”中添加内容或更改迁移文件?

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

1 个答案:

答案 0 :(得分:3)

~~~~(大于_≤)~~~~   问题是控制器方法&#34; @ user = User.where(&#34; id =?&#34;,params [:id])&#34;。 &#34;其中&#34;方法无法判断结果是数组还是实际上是一个对象。如果我使用&#34; @ user = User.find(params [:id])&#34 ;, rails将足够聪明&#34;要知道&#34;哦,是的,这只是一个对象,它有一个名为Friends的方法,因为有人将两个模型连接在一起&#34;。   学习Rails喜欢结婚,你认为你很了解她,但有时候你会想到#34;上帝其实我对这个神秘人一无所知。&#34;