Что эквивалентно для write_attribute для ассоциаций в Rails? - PullRequest
7 голосов
/ 28 мая 2011

Я бы хотел переопределить установщик для ассоциации, но write_attribute () не работает - возможно, потому что этот метод работает только для столбцов базы данных.

Я пробовал super (), но это нетоже не работает (не думал, что это будет ... но стоило догадываться).

Как мне переопределить сеттер?Вот что я пытаюсь сделать:

  def parent=(value)
    # this line needs to be changed
    write_attribute(:parent, value)

    if value.subject.start_with?('Re:')
      self.subject = "#{value.subject}"
    else
      self.subject = "Re: #{value.subject}"
    end

    self.receivers << value.sender
  end

Ответы [ 4 ]

11 голосов
/ 13 июня 2013

Что сработало для меня, так это:

def parent=(new_parent)
  # do stuff before setting the new parent...

  association(:parent).writer(new_parent)
end
3 голосов
/ 28 мая 2011

Я нашел один способ сделать это, но меня это беспокоит:

  alias_method :old_parent=, :parent=

  def parent=(value)
    self.old_parent = value

    if value.subject.start_with?('Re:')
      self.subject = "#{value.subject}"
    else
      self.subject = "Re: #{value.subject}"
    end

    self.receivers << value.sender
  end

Одна вещь, которая мне не обязательно нравится в Rails, это то, что всякий раз, когда вы хотите сделать что-то, что выходит за рамкинемного, но не безосновательно - «как» сильно отличается от того, что придумает ваша интуиция.

Это не проблема, когда вы знаете исключения,но когда вы учитесь, такого рода нерегулярность и непоследовательность в том, как что-либо делать, усложняет изучение, а не упрощение.

Изначально Java может быть сложнее в изучении, но это гораздо более согласованно.Ваша интуиция может продвинуть вас намного дальше, если вы будете думать на Java.Это неправда, если подумать в Rails.Rails - это запоминание вызываемых методов и запоминание действий.В Java вы можете объяснить это намного больше ... и intellisense заполняет все остальное.

Я просто разочарован.Это повторяющийся шаблон для меня - я хочу сделать что-то, что «немного сложнее», чем примеры из фреймворка ... и «как» противоречиво и занимает 30 минут или даже часов, чтобы найти и найти ответ дляэто.

2 голосов
/ 14 сентября 2015

В Rails 4.2.1 doc:

# Association methods are generated in a module that is included into the model class,
# which allows you to easily override with your own methods and call the original
# generated method with +super+. For example:
#
#   class Car < ActiveRecord::Base
#     belongs_to :owner
#     belongs_to :old_owner
#     def owner=(new_owner)
#       self.old_owner = self.owner
#       super
#     end
#   end
0 голосов
/ 20 июня 2012

Вместо

def parent=(value)
  write_attribute(:parent, value)
end  

Не могли бы вы просто сделать:

def parent=(parent)
  parent_id = parent.id
end  
...