Добавление кода в модель с пользовательской задачей rake

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

Чтобы избавить меня от необходимости открывать мою модель пользователя и вручную вставлять «has_many :posts», я хотел бы написать задачу rake, которая автоматически сделает это за меня.

Если бы я упаковал свой движок как генератор внутри драгоценного камня, то, вероятно, сработало бы следующее:

def manifest
  record do |m|     
    m.insert_into "app/models/user.rb", 'has_many :posts'
  end
end  

Можно ли сделать что-то подобное из задачи грабли? Я огляделся и не могу найти ответ... заранее спасибо


person stephenmurdoch    schedule 09.12.2009    source источник


Ответы (3)


Можете ли вы включить файл модели в свой плагин, который откроет класс User и добавит «has_many :posts»?

class User < ActiveRecord::Base
   has_many :posts
end

Я думаю, это сработает, потому что вы можете открывать классы Ruby в любое время и из любого файла; поэтому независимо от того, имеет ли проект, использующий ваш плагин, файл user.rb в папке своей модели, ваш файл также будет загружен, а has_many будет добавлен в класс User во время выполнения.

Надеюсь, поможет.

person Juan Tarquino    schedule 09.12.2009

Вы определенно можете получить доступ к своей модели через задачу rake. Однако вы должны обязательно передать ему свою среду, чтобы он знал о ваших моделях. Например,

desc"This will insert the Posts"

task(:insertPosts => :environment) do

#your code here

end
person sosborn    schedule 09.12.2009
comment
Привет, Сосборн, спасибо за совет. Решение этой конкретной проблемы состояло в том, чтобы включить файл user.rb внутрь плагина (по совету Хуана), чтобы файл usre.rb, который уже присутствовал в приложении до установки плагина, был расширен дополнительными функциями. - person stephenmurdoch; 09.12.2009

Является ли это задачей, в которой уместно изменение исходного кода? Рассматривали ли вы включение модуля? Пожалуйста, предоставьте дополнительную информацию о том, чего вы пытаетесь достичь, для правильного руководства.

person Steve Graham    schedule 09.12.2009
comment
Привет, Стив. Я рассмотрю эту идею использования модуля. На данный момент решение, предоставленное Хуаном, работает. - person stephenmurdoch; 09.12.2009