Модель rails: has_many с собственными аргументами (НЕ ассоциация) - PullRequest
0 голосов
/ 01 сентября 2009

Ну, я не знаю, полностью ли я ошибаюсь, но я действительно не могу найти очень практичный и прямой способ сделать что-то вроде этого:

class User < ActiveRecord::Base

has_many :creations

end

но дело в том, что я просто хочу, чтобы у пользователя было много творений, если user.developer == true где user.developer - это просто логическое поле в таблице Users.

Так есть какие-нибудь идеи о том, как именно я могу сделать это прямо из модели?

Возобновление, когда пользователь не является разработчиком , если вы пытаетесь получить User.first.creations, User.first.creations.new ... создать ... уничтожить и т. Д. вы получаете NoMethodError , но если он разработчик , вы можете создать новое творение.

Единственный способ, которым мне удалось это сделать, - это расширение модели и из проверки расширения, если proxy_owner.developer == true , но при этом мне пришлось переписать все действия, такие как new, create, обновление и т.д ...

Любая помощь будет высоко ценится Большое спасибо

Ответы [ 2 ]

2 голосов
/ 01 сентября 2009

Как насчет создания подкласса User и указания только has_many в подклассе разработчика? Затем разработчик получит любую логику от пользователя, и у пользователей не будет творений.

class User < ActiveRecord::Base
end

class Developer < User
  has_many :creations
end
0 голосов
/ 01 сентября 2009

В том числе это может работать. Если нет, возможно, вам придется прибегнуть к alias_method_chain, но я слышал, что это связано с серьезной организованной преступностью, так что следите за собой.

module CreationsJustForDevelopers
  def creations(*args)
    if developer?
      super
    else
      raise NoMethodError, "Only developers get creations."
    end
  end
end

Не уверен, к чему вы обращаетесь со всеми этими разговорами о переопределении new, create, update и т. Д. ... но единственный другой метод, который я могу удалить, это creation_ids, но кого это волнует?

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