Предоставьте отношение has_many через одно текстовое поле

У меня есть модель А, у которой «много» Б.

class A < ActiveRecord::Base
  has_many :B
  attr_accessible :title
end
class B < ActiveRecord::Base
  belongs_to :A
  attr_accessible :name
end

Я хочу добавить поле в свою форму «редактировать A»: текстовое поле, в котором я буду вводить свои B :name для каждой строки, а при отправке анализировать поле и обрабатывать каждую строку.

Вопрос в том, как мне это сделать?

Редактировать

Следуя Rails - добавьте атрибуты не в модель и обновите атрибут модели Я пришел к этому:

class A < ActiveRecord::Base
  has_many :B
  attr_accessible :title

  def my_b
    list = ""
    self.B.each do |b|
      list += "#{b.name}\n"
    end
    logger.debug("Displayed Bs : " + list)
    list
  end

  def my_b=(value)
    logger.debug("Saved Bs : " + value)
    # do my things with the value
  end

end

Но def bees=(value), похоже, так и не уволили.

Что я делаю неправильно ?

Редактировать 2

Мой фактический код виден здесь: https://github.com/cosmo0/TeachMTG/blob/edit-deck/app/models/deck.rb


person thomasb    schedule 05.10.2013    source источник


Ответы (2)


Вы можете поместить :attr_accessor, например:

class A < ActiveRecord::Base
  has_many :B
  attr_accessible :title
  attr_accessor :field_of_happiness

  def field_of_happiness=(value)
    # override the setter method if you want 
  end

  def field_of_happiness(value)
    # override the getter method if you want 
  end
end

Ссылка: документация attr_accessor API

Вам это как-то помогает?

person wallacyyy    schedule 05.10.2013
comment
Я на самом деле тестировал это. Когда я редактировал свой вопрос, сеттер никогда не увольнялся. - person thomasb; 05.10.2013

О боже. Оказывается, проблема была не в модели, а в контроллере... Я забыл добавить простую строку в метод update, чтобы присвоить значение POST полю моего класса...

Во всяком случае, окончательное решение таково:

В моем контроллере:

  def update
    @a.whatever = params[:a][:whatever]
    @a.my_b = params[:a][:my_b]
    @a.save
  end

В моей модели:

class A < ActiveRecord::Base
  has_many :B
  attr_accessible :whatever

  def my_b
    list = ""
    self.B.each do |b|
      list += "#{b.name}\n"
    end
    list
  end

  def my_b=(value)
    # parse the value and save the elements
  end
end
person thomasb    schedule 21.12.2013