2015-12-29 3 views
0

У меня есть таблица дружбы,Объединить два Rails модель

create_table "friendships", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "friend_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.string "name" 
end 

Когда пользователь добавляет друг модель дружбы создает новую запись с уникальным идентификатором user_idfriend_id и значением name.

В моем угловом приложении у меня есть шаблон, который повторяет каждый friendship in friendships.

Это результат JSON, когда друг был добавлен,

[{"id":17,"friend_id":3,"name":"Kees Keesen"}] 

Идентификатор является идентификатор дружбы и friend_id фактический идентификатор пользователя друга.

Итак, что я делаю сейчас, это дублирование моих данных. У меня есть модель пользователя с именами, сообщениями электронной почты и т. Д. Но когда я добавляю друга, мне нужно добавить значение имени (и больше) в запись дружбы.

Это результат JSON из users.json,

{"id":3,"email":"[email protected]","name":"Kees Keesen"} 

Так можно ли сохранить дружбу unqique идентификатор (который мне нужно, чтобы удалить запись дружбы), но сделать ссылку на пользовательскую модель поэтому мне не нужно дублировать мои данные?

* обновление *

Вот мой контроллер дружба,

def index 
    friends = current_user.friendships.as_json 
    # friends = current_user.friends.as_json(:only => [:name, :email, :id]) 
    render :json => friends 
end 

Я добавил это к моей модели пользователя,

has_many :friendships 
has_many :friends, :through => :friendships 
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
has_many :inverse_friends, :through => :inverse_friendships, :source => :user 

И это к моей дружбе модели,

belongs_to :user 
belongs_to :friend, :class_name => "User" 

Я удалил столбец имен из таблицы дружбы, выход для дружбы в формате JSON теперь,

[{"id":2,"user_id":1,"friend_id":1,"created_at":"2015-12-29T19:24:28.788Z","updated_at":"2015-12-29T19:24:28.788Z"}] 

ответ

0

В угловой стороне вещей, вы должны сделать метод, чтобы получить пользователь по идентификатору, который обращается кеш за кулисами. Затем, когда вы получаете дружбу, замените идентификаторы на объекты пользователя, которые они представляют, используя этот метод. Если пользователь уже был замечен, вам не нужно будет запрашивать его снова с сервера. Формат JSON имеет недостаток в том, что он не может представлять ссылки, поэтому мы склонны использовать идентификаторы вместо этого и просто превращаем их в ссылки, как только получим объект.

1

Путь к счастью здесь с ассоциативной ассоциацией.

class User < ActiveRecord::Base  
    has_many :friendships 
    has_many :friends, :through => :friendships 
    has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
    has_many :inverse_friends, :through => :inverse_friendships, :source => :user 
end 

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, class_name: "User" 
end 

С помощью этого решения вы получите уникальный идентификатор для ограничения структуры данных, user_id для Вашего пользователя, и friend_id для взаимного аспекта дружбы, оба из которых указывают на User модели, чтобы избежать дублирования. Это довольно распространенный способ сделать что-то.

Примечание: inverse_friendships используются для запроса того, кто был добавлен конкретным пользователем, а не того, кого они лично добавили.

UPDATE

Для того, чтобы получить доступ к User информации через Friendship, можно делегировать атрибут вызовов:

class Friendship < ActiveRecord::Base 
    ... snip ... 

    delegate :name, :email, to: :friend 
end 

Надеется, что это помогает!

+0

Благодарим вас за ввод. Возможно, я неправильно применяю код, но, похоже, изменений нет. Что вы ожидаете от json? Кроме того, если я прокомментирую код в модели «дружбы», json все равно будет отображаться одинаково, другими словами модель дружбы, похоже, ничего не делает. Ах, я вижу, что вы получили код из Railscast. Это был и мой проводник. –

+0

Если ваш JSON не меняется вообще, вы должны перезапустить все. Это совсем другой код;) Самое простое - проверить и убедиться, что в вашем представлении JSON нет поля имени. –

+0

Hm. Я закрыл сервер своих рельсов. Удалили столбец имен из таблицы дружбы, сбросили мою базу данных и повторно загрузили, но все же вывод json не изменился. Я обновил свой вопрос, чтобы отразить изменения. Может быть, вы можете заметить то, что я делаю неправильно? Возможно, в контроллере. –

Смежные вопросы