2017-02-08 8 views
0

Я пытаюсь сконденсировать большой набор данных с некоторыми правилами и затем возвращать объект.Метод экземпляра Rails для редактирования объекта данных

Что I've сделано в модели заключается в следующем:

class Network < ActiveRecord::Base 
    def condense 
    self.each do |row| 
     #Maybe delete row 
    end 
    return self 
    end 
end 

Так может быть, я не понял, но вызова Network.all.condense не работает.

undefined method `condense' for #<Network::ActiveRecord_Relation 

Может быть, некоторые более просвещенным рельсы гуру может помочь мне :)

ответ

0

Вы можете создать класс, который принимает в массиве Networks вы хотите condense

class NetworkCondenser 
    def initialize(networks) 
    @networks = networks 
    end 

    def call 
    @networks.each do |network| 
     # do your stuff here 
    end 
    @networks 
    end 
end 

и использовать его, как это, от контроллера или пульта или любой другой.

networks = Network.take(100) 
condensed_networks = NetworkCondenser.new(networks).call 

Edit:

Существует еще один способ, и это вызвать метод condense по каждому элементу в активной записи массива.

class Network < ApplicationRecord 
    def condense 
    # do your stuff here on a single instance only 
    # e.g. name = name.upcase if something 
    end 
end 

А затем из консоли или контроллера вызывается этот метод для каждого экземпляра массива.

networks = Network.take(100) 
networks.each(&:condense) 

Какое решение лучше зависит от вкуса и ваших потребностей. Наверное, я предпочел бы первый вариант для более сложных ситуаций.

+1

Ааа, вот он у нас! Огромное спасибо. Это было именно то, что я искал –

+0

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

+0

@JonasUlveseth Я обновил ответ с помощью возможного решения – Iceman

1

Вы определили метод экземпляра, в то время как то, что вы хотите одноэлементно метод Network «s:

def self.condense 
    # now `self` here is a `Network` class itself 
    all.each do |row| # iterate over each instance of the class 
    end 
end 

Использование:

Network.condense 

PS Имейте в виду, что использование all.each является очень дорогостоящей операцией, потому что оно будет загружать все в память перед обработкой - может быть, есть способ использовать уровень базы данных, чтобы делать то, что вы делаете?

+0

Я понимаю синглтон. И я пробовал это, и он работает. Но я хочу, чтобы гибкость в работе с объектом wathever была в экземпляре. Так как Network.take (100) .condense Или Network.where (что-то: "123"). All.condense –

+0

@JonasUlveseth 'Network.take (100) 'будет возвращать экземпляр' Array' и будет вызывать 'undefined method 'condence' for ...'. –

+0

Да, я могу понять, почему он терпит неудачу. Просто подумайте, что это чистый способ сделать это, и я не могу понять, что вокруг нет пути. Я мог бы просто передать объект в любой метод, и он будет работать. Но было бы неплохо работать с такими примерами. –

-1

Единственная проблема, с которой вы сталкиваетесь, заключается в том, что вы не понимаете self. Вот основное правило:

  • self в методе экземпляра относится к текущему объекту класса.
  • self в методе класса относится к самому классу.

Итак, можете ли вы рассказать мне, что представляют собой 2 self в вашем коде?

+0

Как я думаю об этом, само относится к объекту данных, который находится в экземпляре Так как Network.new, то у self есть новый объект в этом. Поэтому я подумал, что при запуске метода, такого как Network.all.condense, я должен иметь доступ к Network.all как self –