Неопределенная ошибка метода при использовании отношения has_many: through на Rails3 - PullRequest
1 голос
/ 11 апреля 2011

Я работаю над небольшим проектом Android с сервером RoR. Вот три модели:

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

конец

Модель Пользователь использует модель Relation для связи с моделью Friend. Я использую скаффолд для создания трех моделей и добавляю код отношений в их файлы моделей. Я также создаю контроллер 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 Ответ

3 голосов
/ 13 апреля 2011

~~~~ (> _ <) ~~~~ Проблема заключается в методе контроллера "@ user = User.where (" id =? ", Params [: id])".Метод where не может определить, является ли результат массивом или фактически одним объектом.Если я использую «@ user = User.find (params [: id])», rails будет «достаточно умен», чтобы знать, что «О да, это всего лишь один объект, и у него есть метод Friends, потому что кто-то подключаетдве модели вместе ".Изучать Rails нравится брак, вы думаете, что хорошо знаете о ней, но иногда вы думаете: «Боже, на самом деле я ничего не знаю о таинственном парне». </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...