HaoQi Li
HaoQi Li

Reputation: 12348

Find model returns undefined when trying to get the attribute of a model by first finding the model by another attribute?

I would like to do something like:

App.Model.find({unique_attribute_a: 'foo'}).objectAt(0).get('attribute_b')`

basically first finding a model by its unique attribute that is NOT its ID, then getting another attribute of that model. (objectAt(0) is used because find by attribute returns a RecordArray.)

The problem is App.Model.find({unique_attribute_a: 'foo'}).objectAt(0) is always undefined. I don't know why.

Please see the problem in the jsbin.

Upvotes: 0

Views: 533

Answers (2)

HaoQi Li
HaoQi Li

Reputation: 12348

Someone on irc gave me this answer. Then I modified it to make it work completely. Basically I should have used filtered.

App.Office.filter( function(e){return e.get('unique_attribute_a') == 'foo'}).objectAt(0)

Then I can get the attribute like:

App.Office.filter( function(e){return e.get('unique_attribute_a') == 'foo'}).objectAt(0).get('attribute_b')

See the code in jsbin.

Does anyone know WHY filter works but find doesn't? They both return RecordArrays.

Upvotes: 0

Cory Loken
Cory Loken

Reputation: 1395

It looks like you want to use a filter rather than a find (or in this case a findQuery). Example here: http://jsbin.com/iwiruw/438

App.Model.find({ unique_attribute_a: 'foo' }) converts the query to an ajax query string:

/model?unique_attribute_a=foo

Ember data expects your server to return a filtered response. Ember Data then loads this response into an ImmutableArray and makes no assumption about what you were trying to find, it just knows the server returned something that matched your query and groups that result into a non-changable array (you can still modify the record, just not the array).

App.Model.filtler on the other hand just filters the local store based on your filter function. It does have one "magical" side affect where it will do App.Model.find behind the scenes if there are no models in the store although I am not sure if this is intended.

Typically I avoid filters as it can have some performance issues with large data sets and ember data. A filter must materialize every record which can be slow if you have thousands of records

Upvotes: 1

Related Questions