Замена для column_names при использовании Mongoid с рельсами 3 и dry_crud - PullRequest
1 голос
/ 08 сентября 2010

Я делал всплеск на Rails 3 и Mongoid, и с приятными воспоминаниями об автоматических лесах в Grails я начал искать СУХОЙ вид для ruby, когда нашел: http://github.com/codez/dry_crud

Iсоздал простой класс

class Capture 
  include Mongoid::Document
  field :species, :type => String
  field :captured_by, :type => String
  field :weight, :type => Integer
  field :length, :type => Integer

  def label
      "#{name} #{title}"
  end

  def self.column_names
    ['species', 'captured_by', 'weight', 'length']  
  end
end

Но поскольку dry_crud зависит от self.column_names, а вышеприведенный класс не наследуется от ActiveRecord :: Base, я должен создать свою собственную реализацию для column_names, подобную приведенной выше.Я хотел бы знать, возможно ли создать реализацию по умолчанию, возвращающую все поля выше, а не жестко закодированный список?

Ответы [ 2 ]

4 голосов
/ 17 июля 2014

Зачем вам все это делать, когда есть встроенный метод?

Для Mongoid:

Model.attribute_names
# => ["_id", "created_at", "updated_at", "species", "captured_by", "weight", "length"] 
3 голосов
/ 09 сентября 2010

Если не вводить новый метод в Mongoid :: Document, вы можете сделать это в своей модели.

self.fields.collect { |field| field[0] }

Обновление : Хм, лучше, если вы упали.

В папке модели создайте новый файл и назовите его model.rb

class Model
  include Mongoid::Document
  def self.column_names
    self.fields.collect { |field| field[0] }
  end
end

Теперь ваша модель может наследовать от этого класса вместо включения Mongoid :: Document. capture.rb будет выглядеть следующим образом

class Capture < Model
  field :species, :type => String
  field :captured_by, :type => String
  field :weight, :type => Integer
  field :length, :type => Integer

  def label
      "#{name} #{title}"
  end
end

Теперь вы можете использовать это изначально для любой модели.

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