Rails app和sqlite(dev)vs postgresql(prod)

时间:2016-05-25 20:52:52

标签: ruby-on-rails postgresql sqlite heroku

我正在学习RoR,我的开发db是默认的,sqlite和我将我的应用程序部署到使用posgresql的Heroku。我理解为了避免这些问题,我也应该使用postgresql开发,并且将来我打算这样做。但是,我有一个问题出现在制作中但不是dev。

问题:我有UserAccount模型。 User可以包含多个Accounts

我进行了迁移,以便在创建Account时,默认情况下其active字段设置为true

class UpdateDefaultAccountActiveValue < ActiveRecord::Migration
  def change
    change_column_default(:accounts, :active, true)
  end
end

这似乎适用于开发。

/views/accounts/index.html.erb中,以下代码会输出truefalse,具体取决于帐户是否有效。

<% @accounts.each do |account| %>
    <tr>
      <% if !(account.credit) %>
        <td><%= link_to account.name, history_url(id: account.id) %></td>
      <% else %>
        <td><%= link_to account.name + ' (Credit)', history_url(id: account.id) %></td>
      <% end %>
      <td><%= account.active %></td>
      <td><%= link_to 'Edit', edit_account_path(account) %></td>
    </tr>
<% end %>

但是,在制作中,/views/accounts/index.html.erb不会输出truefalse,具体取决于帐户是否有效。

为什么会这样,我该如何解决?

papertrail log:

2016-05-25T21:34:06.348465+00:00 app[web.1]: Started GET "/accounts" for 176.248.123.34 at 2016-05-25 21:34:06 +0000

2016-05-25T21:34:06.355649+00:00 app[web.1]: Processing by AccountsController#index as HTML

2016-05-25T21:34:06.447420+00:00 app[web.1]: Completed 200 OK in 94ms (Views: 64.5ms | ActiveRecord: 18.2ms)

2016-05-25T21:34:06.452111+00:00 heroku[router]: at=info method=GET path="/accounts" host=???.herokuapp.com request_id=f33ab960-5c1b-4883-a28c-8c2b40388bad fwd="176.248.123.34" dyno=web.1 connect=0ms service=107ms status=200 bytes=4073

2 个答案:

答案 0 :(得分:1)

这可能无法解决您遇到的确切问题,但有一种更好的方法可以向模型添加不同于布尔标志的状态。

ActiveRecord::Enum让我们创建一个枚举属性,其中值映射到数据库中的整数。

class Account
  enum status: [:active, :closed, :supended] # basically whatever you want
end
Acount.active     # => Acount.where(status: :active)
acount.active!    # => Acount.update!(status: :active)
acount.active?    # => true
acount.closed?    # => false
acount.suspended? # => false
acount.status     # => "active"

当然,您需要将整数列添加到数据库中:

rails g migration add_status_to_accounts status:integer:index

不要迁移它!我们还想添加默认值:

class AddStatusToAccounts < ActiveRecord::Migration
  def change
    add_column :accounts, :status, :integer, default: 0, null: false
    add_index :accounts, :status
  end
end

答案 1 :(得分:0)

为了在创建记录时设置模型属性,您必须在模型中更改它,如果您运行迁移,它将仅对现有记录有所帮助。

您需要在模型中添加三行代码才能使其适用于创建的新帐户:

before_save do
 self.active = true
end