найти (: все) и затем добавить данные из другой таблицы в объект - PullRequest
0 голосов
/ 19 февраля 2010

У меня есть две таблицы:

create_table "friendships", :force => true do |t|
    t.integer  "user1_id"
    t.integer  "user2_id"
    t.boolean  "hasaccepted"
    t.datetime "created_at"
    t.datetime "updated_at"
end

и

create_table "users", :force => true do |t|
    t.string   "email"
    t.string   "password"
    t.string   "phone"
    t.boolean  "gender"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "firstname"
    t.string   "lastname"
    t.date     "birthday"
end

Мне нужно показать пользователю список Friendrequests, поэтому я использую этот метод в своем контроллере:

def getfriendrequests
    respond_to do |format|
        case params[:id]
            when "to_me"
                @friendrequests = Friendship.find(:all, :conditions => { :user2_id => session[:user], :hasaccepted => false })
            when "from_me"
                @friendrequests = Friendship.find(:all, :conditions => { :user1_id => session[:user], :hasaccepted => false })
        end
        format.xml  { render :xml  => @friendrequests }
        format.json { render :json => @friendrequests }
    end
end

Я делаю почти все, используя AJAX, поэтому, чтобы получить имя и фамилию пользователя с UID user2_id (параметр to_me появится позже, не беспокойтесь сейчас), мне нужноцикл for, который делает несколько вызовов AJAX.Это отстой и стоит много трафика.Поэтому я бы предпочел, чтобы getfriendrequests также возвращал имя и фамилию соответствующих пользователей, поэтому, например, ответ JSON не будет:

[
  {
    "friendship": {
      "created_at": "2010-02-19T13:51:31Z",
      "user1_id": 2,
      "updated_at": "2010-02-19T13:51:31Z",
      "hasaccepted": false,
      "id": 11,
      "user2_id": 3
    }
  },
  {
    "friendship": {
      "created_at": "2010-02-19T16:31:23Z",
      "user1_id": 2,
      "updated_at": "2010-02-19T16:31:23Z",
      "hasaccepted": false,
      "id": 12,
      "user2_id": 4
    }
  }
]  

, а скорее:

[
  {
    "friendship": {
      "created_at": "2010-02-19T13:51:31Z",
      "user1_id": 2,
      "updated_at": "2010-02-19T13:51:31Z",
      "hasaccepted": false,
      "id": 11,
      "user2_id": 3,
      "firstname": "Jon",
      "lastname": "Skeet"
    }
  },
  {
    "friendship": {
      "created_at": "2010-02-19T16:31:23Z",
      "user1_id": 2,
      "updated_at": "2010-02-19T16:31:23Z",
      "hasaccepted": false,
      "id": 12,
      "user2_id": 4,
      "firstname": "Mark",
      "lastname": "Gravell"
    }
  }
]   

Я думал о цикле for в методе getfriendrequests, но я не знаю, как это реализовать, и, возможно, есть более простой способ.Он также должен работать для XML.Может кто-нибудь мне помочь?Спасибо

1 Ответ

0 голосов
/ 19 февраля 2010

при звонке

render :xml  => @friendrequests

Rails выполняет итерацию каждого элемента в массиве и вызывает метод ActiveRecord::Base#to_xml. Аналогично, опция :json означает вызов ActiveRecord::Base#to_json.

И to_xml и to_json имеют опцию :methods, которая содержит массив методов для включения в сериализацию.

Решение действительно простое. Переопределите эти методы.

class Friendship

  # ...

  def firstname
    # here get the first name
  end

  def lastname
    # here get the last name
  end

  def to_xml(options = {})
    options[:methods] ||= [:firstname, :lastname]
    super(options)
  end

  def to_json(options = {})
    options[:methods] ||= [:firstname, :lastname]
    super(options)
  end

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