2009-08-31 1 views
0

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

class User < ActiveRecord::Base 

has_many :creations 

end 

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

Итак, любые идеи о том, как именно я могу это сделать непосредственно из модели?

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

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

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

ответ

2

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

class User < ActiveRecord::Base 
end 

class Developer < User 
    has_many :creations 
end 
+0

Это действительно способ сделать это. Классический пример поведения, который должен быть смоделирован в наследовании. Вам нужно будет быстро прочитать рельсы STI, чтобы узнать, как его настроить, это действительно очень просто. Затем вы можете делать такие вещи, как Developer.find_blah. – dalyons

+0

Спасибо за это, я действительно сделал это, прежде чем придумать «отличную» идею использовать меньше моделей в своем приложении. Я думал, что нет необходимости иметь новую модель для этого, так как это очень простая вещь, поэтому я начал меня менять. Но, как я вижу, мне придется вернуться к этой идее. Но одно можно сказать наверняка, что это действительно интригано, так это тот факт, что нет «простого способа» сказать: «Хорошо, я просто хочу, чтобы эта модель имела _many: blas, если эта модель имеет этот атрибут», помимо создания новой модели. – zanona

+0

Я пробовал это (http://pastebin.com/f3eb450a3) И он работал над первым вызовом, но после того, как он впервые создает приложение has_many: apps, он присоединяет его к классу, поэтому вы не можете его переопределить. Но, спасибо за вашу помощь, очень благодарен – zanona

0

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

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

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

+0

Спасибо за этот cwninja, он действительно открыл мой разум о реализации по-другому. но, к сожалению, кажется, что mixin не отменяет метод ** has_many: творения **, поэтому он не действует. Возможно, я делаю что-то неправильно. Я попытался объявить функцию творения после ** has_many: творения **, и он работал над поиском, когда его разработчик и когда его нет, но когда разработчик? Я получаю следующее: ** NoMethodError: super: нет метода суперкласса 'творения '** Я постараюсь получить какой-то результат от этого, Спасибо за помощь снова :) – zanona

+0

Ответ Джареда выше по-прежнему опрятный , если по какой-то причине вы не будете вынуждены делать это таким образом. Метод суперкласса не может быть вызван тем, что вы включили модуль до того, как ассоциация была настроена. Попробуйте переместить его после 'has_many: творения'. – cwninja

+0

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

Смежные вопросы