【问题标题】:Converting a Ruby application to Ruby on Rails ActiveRecord one将 Ruby 应用程序转换为 Ruby on Rails ActiveRecord 之一
【发布时间】:2015-11-18 14:30:02
【问题描述】:

假设我们有一个这样的 ruby​​ 类:

class Song
  attr_reader :id, :title, :author, :path

  def initialize(id, title, author, path)
    @id = id
    @title= title
    @author= author
    @path = path
  end

  def change_title(new)
    @title = new
  end

  def change_path(new)
    @path = new
  end

  # other functions here, some operations and stuff

end

如果我们要将它“转换”为 Rails ActiveRecord,我们应该怎么做? (请举例)我对此很陌生,不太了解它是如何工作的,所以我想我可以在这里问。

第二部分是,我们有很多测试(例如 RSpec)

before(:each){
  @song = Song.new(Random.rand(100), 
                   'Some song', 'Some author', 'C:/song.mp3')
}    

it 'change songs path' do
  new_path = 'D:/new_path/something.mp3'
  @song.change_path(new_path)
  expect(@song.path).to eq new_path
end

您能否提供一些示例,说明我们如何为测试生成测试数据以及我们应该如何更改测试,例如使用 Fixtures 或 Factory_girl 等。

对于你们中的一些人来说很愚蠢的问题也许很抱歉,因为有文档,但我觉得很难理解,所以想我提供的实际情况可能会有所帮助。

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing activerecord rspec


    【解决方案1】:

    在我看来,您应该将业务逻辑和数据分开保存。这样可能的解决方案就可以通过几个步骤来描述:

    1. 创建一个新的 ActiveRecord 模型,例如歌曲
    2. 添加 glue 模块,该模块将在 AR 模型和您的自定义类属性之间执行读/写操作。

    此解决方案的好处是您不需要重写业务层和测试,只需将 glue 模块混入到您的类中。

    【讨论】:

    • 据我所知,数据必须存储在数据库中。
    • 是的,模型的目的是执行数据存储,您的业务逻辑保持不变。
    • 是的,我知道逻辑不应该改变,但应该有一些简单的改变,比如继承 ActiveRecord::Base 和类似的东西,但我不太完全理解还有什么应该改变的,我应该将我的测试和逻辑类放到相应的“模型”文件夹中吗?
    • 您不应将逻辑类移动到模型文件夹,而应单独创建模型。因此模型负责持久层,现有代码的其余部分应调用与模型一起使用的胶水模块的读/写函数
    【解决方案2】:

    这取决于您的项目,但通常,Rails 的模型应该与您的 Ruby 应用程序中的模型相对应。可能您需要做的只是从ActiveRecord::Base 继承您的Song 类,在数据库中创建表“songs”(通常是通过迁移完成),然后就可以了!

    @funnydaredevil 所说的是将持久层与逻辑层解耦。降低大型应用程序的复杂性是一个常见的决定。但我认为,在应用程序生命的最初阶段,它是过度设计的。

    关于测试:你当然可以使用 Factory Girl。

    before do
      @song = FactoryGirl.build(:song)
    end
    
    # factories/song.rb
    FactoryGirl.define do
      factory :song do
        id { Random.rand(100) }
        title  'Some song'
        author 'Some author'
        path 'C:/song.mp3'
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多