Ruby / Rails - добавляет записи к объекту с каждой итерацией цикла / Object vs Arrays - PullRequest
0 голосов
/ 14 января 2011

Я пытаюсь выяснить, как добавлять записи в существующий объект для каждой итерации цикла.Мне трудно найти разницу между объектом и массивом.

У меня есть это

 @events = Event.find(1)
 @loops = Choices.find(:all, :limit => 5)  #so loop for 5 instances of choice model
 for loop in @loops
       @events = Event.find(:all,:conditions => ["event.id = ?", loop.event_id ])
 end

Я пытаюсь добавить новые события в существующий объект @eventsна основе идентификатора любой переменной цикла.Но оператор (=) просто создает новый экземпляр объекта @events.

Я пробовал (+ =) и (<<) в качестве операторов, но получил ошибку </p>

"У вас естьобъект nil, когда вы этого не ожидали! Возможно, вы ожидали экземпляр массива. Произошла ошибка при оценке nil "

Я попытался создать массив

 events = []
 events << Event.find(1)
 @loops = Choices.find(:all, :limit => 5)  #so loop for 5 instances of choice model
 for loop in @loops
       events << Event.find(:all,:conditions => ["event.id = ?", loop.event_id ])
 end

Но я не знаюкак вызывать атрибуты массивов в представлении

С объектами я смог создать цикл внутри представления и также вызвать все атрибуты этого объекта ...

<table> 
<% for event in @events %>
<tr>
  <td><%= link_to event.title, event %></td>
  <td><%= event.start_date %></td>
  <td><%= event.price %></td>
</tr>
<% end %>
</table>

КакМогу ли я сделать это с набором массивов?

Так что вопросы

1) В чем разница между массивами и объектами?
2) Есть ли способ добавить в существующий объектдля каждой итерации?
3) Если я использую массив, есть ли способ вызвать атрибуты для каждой записи массива в представлении?

Ответы [ 5 ]

5 голосов
/ 14 января 2011

Сначала сделайте шаг назад. Давайте точно выясним, что вы пытаетесь сделать.

Мне кажется, что: Найти все события, на которые ссылаются первые пять вариантов выбора .

Если это все, что вы пытаетесь сделать, сэкономьте время и вопросы, написав:

@choices = Choices.limit(5).include(:event)

Это предполагает, что между этими двумя существует has_{one,many} / belongs_to связь, которая, я думаю, должна быть. Хотя названия классов достаточно расплывчаты, чтобы я что-то упустил.

Затем вы можете просмотреть @choices и извлечь связанный с ним event. Или используйте что-то вроде Enumerable#collect

Вы можете прикрепить Event.find(1) к массиву, который он создает, используя Array # push или Array # << </a>.

5 голосов
/ 14 января 2011
@events = []
@events << Event.find(1)
@loops = Choices.find(:all, :limit => 5)
for loop in @loops
    es = Event.find(:all, :conditions => ["event.id = ?", loop.event_id])
    for e in es
        @events << e
    end
end
2 голосов
/ 14 января 2011

Мы должны догадаться, потому что нет подробной информации о моделях и их отношениях. Но при условии, что выбор has_many события я бы сделал (добавьте включение событий, если вы заботитесь об эффективности):

@events = [Event.find(1)] + Choice.all(:limit => 5).map(&:events).flatten

Это также должно работать, даже если у вас нет ассоциаций с Rails, хотя это выглядит некрасиво (разве ActiveRecord не слишком разборчив в том, что принимает в качестве аргументов?):

@events = Event.find(1, Choice.all(:limit => 5).map(&:event_id))
0 голосов
/ 14 января 2011

Если вы используете Rails 3, вы можете сделать это:

loops = [1] + Choice.select("event_id").limit(5).collect {|x| x.event_id}
@events = Event.all(:conditions => ["id in (?)", loops])

Это соберет все event_id из выборов в массив, добавленный к идентификатору события 1, который затем может быть использован впредложение IN запроса Event.all.Это должно быть более эффективным, чем циклический выбор и генерация запросов для каждого.

0 голосов
/ 14 января 2011
  1. В JavaScript есть объект, который хранит пары ключ-значение (аналогично хешу в Ruby), а также массив (который хранит упорядоченный набор значений).В JavaScript для массивов (как и для всех объектов) могут быть добавлены произвольные свойства в любое время.Это вызывает некоторую путаницу между объектами и массивами в JavaScript.В Ruby это не так.

    • В Ruby Object - это базовый класс , от которого все другие объекты наследуют .Вы можете прочитать документацию по объекту здесь .
    • В Ruby Array - это класс для хранения упорядоченного списка значений.Вы можете прочитать документацию для Array здесь .
    • В Ruby практически все является "объектом", если в нем есть методы.* Вместо «Объект» я думаю, что вы имеете в виду «переменная экземпляра».Переменные экземпляра имеют префикс «at», например, @foo.Переменные сами по себе не являются объектами и не содержат объектов ;скорее они указывают на (или ссылка ) объектов.Объекты, на которые они ссылаются, могут быть разных типов.
    • @ Justice показал вам один из способов добавления элементов в массив внутри цикла.

      Если у вас есть переменная экземпляра, которая является массивом, вы можете перебирать ее значения внутри представления.Синтаксис этого зависит от того, какую систему шаблонов вы используете (Erb, Haml и т. Д.)

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