2016-01-26 2 views
0

В моей модели я пытаюсь динамически выставлять объекты, находящиеся внутри массива, как атрибут верхнего уровня. Вот фрагмент кода:Значение привязки к ruby ​​define_method

class Widget < ActiveRecord::Base 
    # attr_accessor :name 
end 

class MyModel < ActiveRecord::Base 
    has_many :widgets 
    #attr_accessor :widgets 

    after_initialize :init_widgets 

    def init_widgets 
    widgets 
    widgets.each_with_index do |widget, index| 
     define_method(widget.name) do 
     widgets[index] 
     end 
    end 
    end 
end 

Есть ли способ для меня, чтобы определить значение индекса в новый метод я создаю так, что он будет связан с соответствующим индексом?

+0

Могут быть лучшие способы делать вещи. Если вы ссылаетесь на 'has_many: widgets' как' array', то это должно быть исправлено. Во-вторых, я бы не советовал вашему блоку 'after_initialize', что он делает, потому что' after_initialize' получает всюду, инициализацию, поиск Active Record и т. Д. Не могли бы вы добавить дополнительную информацию к своей проблеме? – vee

+0

По умолчанию вы можете получить доступ к файлам 'my_model.widgets [0]', 'my_model.widgets [1]', 'my_model.widgets.last' и т. Д. - что-то не хватает в этом способе делать что-то? –

ответ

0

я мог бы создать методы аксессор/назначения, которые перегружают оператор []:

class BracketOperator 
    def initialize 
    @values = (1..100).to_a 
    end 

    def [](index) 
    @values[index] 
    end 

    def []=(index, value) 
    @values[index] = value 
    end 
end 

bo = BracketOperator.new 
bo[3] # => 4 
bo[3] = 17 
bo[3] # => 17 
0

Так для справки, вот ответ, который я придумал. По-видимому, я не очень хорошо разбираюсь в рубине. Переменная n как-то остается ссылкой на n в каждом цикле. Поэтому для моего первоначального вопроса я могу просто использовать переменную index внутри метода, и она будет сопоставлена ​​с тем, что я ожидаю от нее.

class Test 
    def setup 
    names = [ "foo","bar" ] 
    names.each do |n| 
     self.class.send :define_method, n do 
     puts "method is called #{n}!" 
     end 
    end 
    end 
end 
Смежные вопросы