小编Edu*_*ard的帖子

如何在Grails中复制域对象?

我想制作一个域对象的副本.实现这一目标的最简单方法是什么?

我意识到我可以创建一个新记录,然后遍历每个字段逐个复制数据 - 但我认为必须有一个更简单的方法来做到这一点......

在Rails中有一种简单的方法:

#rails < 3.1
new_record = old_record.clone

#rails >= 3.1
new_record = old_record.dup
Run Code Online (Sandbox Code Playgroud)

Grails有没有相应的东西?

grails grails-domain-class grails-2.0

7
推荐指数
2
解决办法
5692
查看次数

Rails通过对象关联重现了奇怪的行为

我有一个与回复相关的评论表.基本上,具有parent_id的注释也是对其父注释的回复.

为了渲染这个,我使用了一个递归视图,过去非常简单,但是没有使用rails 3.2.0和ruby 2.1.1

这是简化的代码:

<% x = comment.replies %>
<%= comment.id %>; <%= comment.class %><br/>
<%= comment.replies.class %><br><br>
<hr>
<br><br>
<% if x and x.is_a?(Array) %>
  <%= render :partial => "/_redesign/entry/comment", :collection => x, :as => :comment%>
<% end %>
Run Code Online (Sandbox Code Playgroud)

输出是:

349223; 注释
数组
349229; 评论
评论

在第二次迭代中,comment.replies是一个Comment,而不是一个数组,并且都从那里掉了下来.

但是,如果我更改第一行并添加重新加载:

<% x = comment.reload.replies %>
Run Code Online (Sandbox Code Playgroud)

一切都开始工作,输出是:

349223; 注释
数组
349229; 注释
Array
349230; 注释
数组

我很想了解这里发生了什么,以及如何返回单个对象实例而不是它们的列表以及为什么要使用重新加载.

添加了型号代码:

class Comment < Response
  acts_as_deactivatable :dependencies => [:community_news_feed_items]

  has_many :replies, :class_name=>"Comment", …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails ruby-on-rails-3.2 ruby-2.1

7
推荐指数
1
解决办法
115
查看次数

如何在Ruby中组合图像

我有4个方形图像,1,2,3和4,每个有2048x2048px.

我需要将它们组合成4096x4096px图像,如下所示:

 1 2
 3 4
Run Code Online (Sandbox Code Playgroud)

现在我正在使用Gimp手动执行此操作,但处理量正在增加,我希望实现自动化解决方案.

在Ruby中有一个简单的方法吗?(Rails gem可以,或者可以从Rails应用程序内部运行的任何shell命令)

ruby linux shell ruby-on-rails image-processing

7
推荐指数
2
解决办法
3566
查看次数

Grails条件可空验证或具有可空选项的自定义验证程序

我有一个表单来创建一个地方.根据国家/地区,省(州,地区)字段是否必需.

当不需要时,我想为null,而不是空字符串.我有代码,使所有空表单字段,null:

def newparams = [:]
        place = new Place()
        params.each() { k, v ->
            if (v instanceof String && place.hasProperty(k)) {
                if (!v.trim().length()) {
                    newparams[k] = null
                } else {
                    newparams[k] = v
                }
            }
        }

        place = new Place(newparams)
        place.validate()
Run Code Online (Sandbox Code Playgroud)

现在,在地方域中,我在该省有一个验证器:

province validator:  {val, obj -> if (obj.country in obj.requiresRegionCountries() && !obj.province) return [province.required]}
Run Code Online (Sandbox Code Playgroud)

有了这个规则,即使是否需要,我总是得到"省不能为空".

我认为这是因为设置的可空验证器默认为false.

如果我添加nullable:true,那么即使省是必需的,也会跳过自定义验证器,并且可以使用空省保存(我认为这是因为它实例化为null)

现在,我需要以某种方式我的自定义验证器,并能够在我的验证器中指定可为空的内容,如下所示:

province validator:  {val, obj -> 
  if (obj.country in obj.requiresRegionCountries() && !obj.province) { 
    nullable: false
    return [province.required] }
  else {
    nullable: …
Run Code Online (Sandbox Code Playgroud)

grails grails-validation grails-domain-class grails-2.0

6
推荐指数
2
解决办法
7986
查看次数

Rails 4 update_all并从另一个字段设置值

我需要在某些模型中进行一些批量更新,并将字段的值设置为另一个字段的值.

现在我可以用这样的原始sql做到这一点:

ActiveRecord::Base.connection.execute("UPDATE `deleted_contents` SET `deleted_contents`.`original_id` = `deleted_contents`.`id` WHERE `deleted_contents`.`original_id` is NULL")
Run Code Online (Sandbox Code Playgroud)

这工作正常,但由于许多原因我需要使用ActiveRecord查询接口.我试过了:

DeletedContent.where(original_id: nil).update_all(original_id: value_of_id_column)
Run Code Online (Sandbox Code Playgroud)

对于value_of_id_column,我试过:id,self.id id等,没有任何作用.我应该为value_of_id_column设置什么来获取rails生成的原始查询?这是可能的,还是使用原始sql是唯一的解决方案?

此外,我不想迭代每个记录并更新.这对我来说不是一个有效的解决方案:

DeletedContent.where(original_id: nil).each do |deleted_content|
    update_each_record
end
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails sql-update ruby-on-rails-4

6
推荐指数
1
解决办法
3535
查看次数

如何通过Active Storage禁用自动生成的路由

我正在将现有应用程序升级到Rails 5.2。

旧的应用程序正在使用Paperclip进行文件存储,而我正在尝试将其移至ActiveStorage。

我的应用程序公开了一个API,该API允许用户安全地上传文件(使用密钥/秘密对来签署请求)。

当我安装ActiveStorage时,我发现了几条新路线

      rails_service_blob GET  /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET  /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET  /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT  /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create
Run Code Online (Sandbox Code Playgroud)

我如何禁用这些路由以不允许随机上传到我的应用程序。

ruby-on-rails rails-activestorage ruby-on-rails-5.2

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