2012-05-25 2 views
2

Итак, я создаю разные леса, которые используют функции «Один ко многим» в Tower, но я не могу понять, как на самом деле связывать связанные экземпляры, чтобы использовать отношения. Например, мои самые последние строительные леса были получены так:Как использовать отношения «один-ко-многим» в Tower.js?

tower generate scaffold User email:string firstName:string lastName:string hasMany:posts 

tower generate scaffold Post title:string body:text userId:integer belongsTo:user 

Теперь в рельсах, что поле идентификатор пользователя, на пост модели, сформирует связь с пользователем обмена, что идентификатор, а затем вы можете использовать это для доступа к отношениям. Но здесь он ничего не делает. Попытка использовать любой из кода отсюда: https://github.com/viatropos/tower/wiki/1-n просто дает мне ошибки.

В консоли башни, я был в состоянии создать пример пользователя и пост (я могу это сделать достаточно легко, запустив сервер и с помощью формы на веб-странице), например так:

tower> user = new App.User 

tower> user.attributes = { email: "[email protected]", firstName: "bill", lastName: "billiams" } 

tower> post = new App.Post 

tower> post.attributes = { title: "A Post", body: "This is a short post.", userId: "4fbf23224503fe670e000006" } 

И эти экземпляры сохранялись в базе данных, но когда я пытаюсь код, как:

tower> user.get('posts').exists() 

Я получаю «Ошибка типа: не удается вызвать метод„существует“неопределенных». Точно так же, называя:

tower> user.get('posts').create(title: 'Berlin never sleeps.') 

производит "TypeError: Невозможно вызвать метод 'создать' неопределенный". То же самое происходит, если я попробую что-нибудь подобное в моделях или контроллерах. Я действительно застрял здесь и несколько дней пытался выяснить, как это работает, но я не знаю, где еще искать. Если у кого-нибудь есть пример кода, который я мог бы заглянуть, это было бы потрясающе, иначе было бы полезно объяснение рода. Благодарю.

[Edit: Мой рабочий пример, наряду с подробным README разъясняются шаги, можно найти здесь: https://github.com/edubkendo/demoApp]

ответ

1

Сейчас отношения доступны через методу, а не добытчик:

user.posts().all (error, posts) -> console.log(posts) 

posts() метод возвращает объект Tower.Model.Relation.HasMany.Scope, который является подклассом Tower.Model.Scope. «Сфера» является то, что позволяет делать запросы к базе данных:

user.posts().where(title: /a/).asc('createdAt').all() 

Просто для справки, вот как строятся отношения. Во-первых, когда вы делаете что-то вроде:

class App.User extends Tower.Model 
    @hasMany 'posts' 

что @hasMany 'posts' идет к /tower/model/relations.coffee#L50, который строит Tower.Model.Relation.HasMany объект, который расширяет Tower.Model.Relation. Класс Tower.Model.Relation определяет методы ассоциации/геттеры в классе owner, : /tower/model/relation.coffee#L85.

Когда вы user.posts(), он создает новый Tower.Model.Relation.HasMany.Scope: /tower/model/relations.coffee#L85, который дает вам все методы искателя/сохраняемости, так же, как делают App.User.asc('createdAt').all(). Подклассы отношения Tower.Model.Scope, чтобы настроить методы поиска/создания/обновления/удаления для ассоциации, это в значительной степени это.

Последнее, что api будет изменено в течение следующих нескольких недель, поскольку мы нормализуем его с помощью полевых методов (то есть user.get('email')).Так скоро, это будет выглядеть следующим образом:

user.get('posts').all() 
user.posts.all() # a getter, if getter/setter support is available in the browser, and it is available in node.js 

Но сейчас, используйте:

user.posts().all (error, posts) -> 

Надежда, что помогает.

+0

Спасибо, это определенно указывает мне в правильном направлении. Итак, как вы можете заставить его фактически установить связь между отдельным пользователем и конкретным сообщением, например? –

+0

Только что понял, что я не учитываю асинхронный характер вызовов в базе данных. Представьте, что это была одна из самых больших причин, почему материал не работает для меня ... lol –

+0

Получил это! Еще раз спасибо, никогда бы не подумал, что он работает как метод, а не геттер/сеттер. Когда-то у меня была эта штука, а потом я понял, что все стараюсь делать все синхронно, вместо того, чтобы асинхронно, все это встало на свои места. Скоро будет пример, и я вернусь сюда и свяжусь с ним. –

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