小编Mar*_*ejo的帖子

rails - 为枚举字段应用默认值

我希望我的枚举字段有一个默认值,以防止它为零.我做了以下事情:

# db/schema.rb
create_table "templates", force: :cascade do |t|
  t.integer  "status"
end

# app/models/template.rb
class Template < ActiveRecord::Base
  STATUSES = [:draft, :published]
  enum status: STATUSES
  after_initialize :init

  def init
    self.status ||= STATUSES.index(:draft)
  end
end
Run Code Online (Sandbox Code Playgroud)

我在当地环境中获得了预期的结果.但在heroku中并不完全.我需要它draft在更新状态后成为默认值nil,但在此上下文中它变为nil但是published范围仍然包括更新的行.

$ heroku run rails console

> Template.published.pluck :id
=> [1, 2]

> Template.find(1).update(status:nil)
Template Load (4.4ms)  SELECT  "templates".* FROM "templates" WHERE "templates"."id" = $1 LIMIT 1  [["id", 1]]
Template Load (4.4ms)  SELECT  "templates".* FROM "templates" WHERE "templates"."id" …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails

5
推荐指数
2
解决办法
7601
查看次数

Rails - 如何针对嵌套资源路由定位嵌套控制器

在我的routes.rb我有

namespace :admin do
  resources :clients do, only: [:index] do
    resources :products, only: [:index, :new, :create]
  end

  resources :products, only: [:index]
end
Run Code Online (Sandbox Code Playgroud)

请注意,我有两行resources :products. 一个嵌套在 中resources :clients,另一个作为 上的顶级资源:admin;这两者在应用程序中都有不同的目的。

rake routes给我:

           admin_clients GET  /admin/clients(.:format)                         admin/clients#index
   admin_client_products GET  /admin/clients/:client_id/products(.:format)     admin/products#index
                         POST /admin/clients/:client_id/products(.:format)     admin/products#create
new_admin_client_product GET  /admin/clients/:client_id/products/new(.:format) admin/products#new
          admin_products GET  /admin/products(.:format)                        admin/products#index                    
Run Code Online (Sandbox Code Playgroud)

我有一个admin_client_products嵌套product#index资源。我也有admin_products顶级product#index资源。然而,它们指向相同的控制器操作:admin/product#index

问题:此时,我需要 Rails 来推断这是两个不同的操作。使用rails约定,有没有办法告诉rails这两个资源应该有不同的控制器操作,即一个应该命中,admin/products#index另一个应该命中admin/clients/products#index

嵌套路由应该这样:

class Admin::Clients::ProductsController < …
Run Code Online (Sandbox Code Playgroud)

routes ruby-on-rails

5
推荐指数
1
解决办法
2832
查看次数

带参数的 Rails 活动管理范围

此处解释了在 ActiveRecord 范围内使用 active admin:Rails3 Active Admin:如何在第一次单击 Shipments 标签时仅显示打开状态记录?

现在我正在尝试使用 params为范围做这件事。

在我的模型中,我有:

#app/models/shipments.rb
scope :by_status, -> (status) { where(status: status) }
Run Code Online (Sandbox Code Playgroud)

我希望能够将其用于app/admin/shipments.rb类似

# app/admin/shipments.rb
scope :by_status 'open'
Run Code Online (Sandbox Code Playgroud)

有没有一种主动的管理方式来做到这一点?

ruby-on-rails activeadmin

4
推荐指数
1
解决办法
1421
查看次数

如何将哈希或JSON字符串保存到jsonb字段中

我有一个来自我的活动管理员的json字符串 "{\"en\":\"Lorem\"}"

我想将其保存在question.namepostgres jsonb类型的字段中。

class Question < ActiveRecord::Base
  serialize :name
end

# db/schema.rb
create_table "preset_questions", force: :cascade do |t|
  t.jsonb    "name",               default: {}
end
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

question.update(name:"{\"en\":\"Lorem\"}")
question.update(name:JSON.parse("{\"en\":\"Lorem\"}"))
Run Code Online (Sandbox Code Playgroud)

两者的结果:

question.name
=> nil
Run Code Online (Sandbox Code Playgroud)

postgresql json ruby-on-rails

4
推荐指数
1
解决办法
5236
查看次数

标签 统计

ruby-on-rails ×4

activeadmin ×1

json ×1

postgresql ×1

routes ×1