小编kak*_*bei的帖子

Ruby将散列内的值转换为局部变量

说我有这个哈希:

entry = {"director"=>"Chris Nolan", "prducer"=>"Sum Duk", "writer"=>"Saad Bakk"}
Run Code Online (Sandbox Code Playgroud)

我想将每个键提取到自己的局部变量中,并带有相关的值:

director = "Chris Nolan"
producer = "Sum Duk"
...
Run Code Online (Sandbox Code Playgroud)

通过使用循环而不是:

director = entry["director"]
Run Code Online (Sandbox Code Playgroud)

由于有很多值,我不想单独进行.

我发现这几乎完全有效,除了它创建一个实例变量,我想要一个局部变量,但local_variable_set由于某种原因不存在.

entry.each_pair { |k, v| instance_variable_set("@#{k}", v) }
Run Code Online (Sandbox Code Playgroud)

有解决方案吗?或者失败了,一种方法将实例变量转换为本地变量并删除实例变量而不逐一进行?

ruby

17
推荐指数
2
解决办法
7863
查看次数

Rails通过Ajax远程删除和更新视图

过去,每当我想通过Ajax更新我的视图的一部分时,我就完成了以下工作:

  1. 创建一个我要更新的部分,并给它一个唯一的ID,比方说 #tracks
  2. 在控制器中为该Ajax调用创建一个特殊操作,比如remove_track更新所有值等,然后添加format.js
  3. 创建一个与操作同名的新JS文件,以便Rails自动调用它remove_track.js.erb,其中包含以下内容:$('#tracks').html("<%=j render 'cds/show_tracks' %>");
  4. remote: true在调用此操作的链接中设置.

这一切都很好,但现在我试图index使用常规destroy方法删除和更新公共视图的灵活性,这意味着我可以通过Ajax或通常调用此方法.我认为这样做很常见,必须有比上述所有方法更好的方法.

我可以destroy.js.erb通过简单地将它放入控制器来获取destroy方法来调用我的文件:

  format.js { layout: false }
Run Code Online (Sandbox Code Playgroud)

当然还要设置remote: true链接.

我不能做的是让视图刷新.我要刷新的表包含在具有唯一ID的div中,但由于它不是部分ID,因此它拒绝刷新内容.也许我错过了什么.

我注定要创建一个局部并使用上面的方法刷新它,还是有更神奇的方法(除了使用Turbolinks)?

谢谢.

PS 此外,我只是注意到这有一个额外的缺点,我不能将其余的参数传递给destroy方法,因为它只使用常规CRUD路由传递对象ID来销毁.如果我尝试使用platform(action: destroy)platform(method: delete)我收到错误:

No route matches {:action=>"destroy", :controller=>"platforms"}
Run Code Online (Sandbox Code Playgroud)

这意味着如果我想传递这些参数,我必须创建一个新路线...

所有这一切的另一个缺点是我在destroy方法中再次重复了我在索引方法中搜索和排序的所有逻辑.我确信这绝对不是这样做的方法.

ajax partial-views ruby-on-rails-3.2

11
推荐指数
1
解决办法
1万
查看次数

Rails仅更新空字段

最近在Stackoverflow中没有很多运气(我认为我是风滚草奖的国王),但无论如何都要进行:

如何在使用activeRecord时仅更新空的字段?我有这个代码:

master_info.update_attributes( {:originalTitle => slave_info.originalTitle,                                                                         
:starring => slave_info.starring,
:theatrical => slave_info.theatrical }
Run Code Online (Sandbox Code Playgroud)

并希望像:

master_info.update_attributes( {:originalTitle => slave_info.originalTitle, if !master_info.originalTitle.present?                                                                        
:starring => slave_info.starring, if !master_info.starring.present?
:theatrical => slave_info.theatrical if !master_info.theatrical.present? }
Run Code Online (Sandbox Code Playgroud)

我可以一次做一行,但我试图避免这样做:

master_info.update_attributes(:originalTitle => slave_info.originalTitle) if !master_info.originalTitle.present?
Run Code Online (Sandbox Code Playgroud)

我读了类似的东西:

master_info.update_attributes( {:originalTitle => slave_info.originalTitle,                                                                         
                          :starring => slave_info.starring,
                          :theatrical => slave_info.theatrical }.reject{ |key, value| value.present?} )
Run Code Online (Sandbox Code Playgroud)

但这不起作用,它不会更新任何内容,甚至不会更新空字段.

事实上,理想的是不必重复字段名称,因为它们在主服务器和从服务器中都被命名为相同,但我不能在activeRecord上执行.each.但这是次要问题,主要问题是更新空字段.

这里希望这个没有风滚草:)

activerecord ruby-on-rails-3.1

9
推荐指数
2
解决办法
3484
查看次数

删除哈希中的键不在数组中

我找不到从散列中删除不在给定键名数组中的键的方法.我读过我可以使用except或者slice,但是如何向他们提供我想要保留的关键名称列表?所以,例如,如果我有这个哈希:

entry = {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en", :imdb=>"", :freebase=>"", :originalTitle => 'casablanca', :season=> '1', :episode => '3'}
Run Code Online (Sandbox Code Playgroud)

我只是想保持,比如说:title,:media:localeLanguage,我怎么能只保留其主要的名字我指定的值?

ruby hash

9
推荐指数
2
解决办法
6740
查看次数

Ruby脚本使用没有Rails的database.yml连接到Mysql2

我想在Ruby脚本中使用mysql2 gem连接到mysql数据库,但是没有Rails或ActiveRecord,但是读取config/database.yml文件是为了不直接在Ruby脚本中公开用户名和密码.如果我像这样使用ActiveRecord,我可以连接:

dbconfig = YAML::load(File.open('config/database.yml'))
ActiveRecord::Base.establish_connection( dbconfig['production'] )
Run Code Online (Sandbox Code Playgroud)

但是,如果我为Mysql2连接尝试相同的技巧,我会收到一个错误:

client = Mysql2::Client.new(dbconfig['production'])
Run Code Online (Sandbox Code Playgroud)

显然语法不同,我需要这样的东西:

client = Mysql2::Client.new(:host => "localhost", :username => "user", :password => 'password', :database => 'db', :socket => '/tmp/mysql.sock')
Run Code Online (Sandbox Code Playgroud)

但是不想直接在脚本中公开用户名和密码.

那我怎么能从config/database.yml中获取所有数据并将其传递给Mysql2::Client.new()方法呢?

谢谢.

编辑

只是想澄清一下,为了最终使它工作我通过这样做修改了一下有关的答案:

client = Mysql2::Client.new(:host => dbconfig['hostname'], :username => dbconfig['username'], :password => dbconfig['password'], :database => dbconfig['database'], :socket => '/tmp/mysql.sock')
Run Code Online (Sandbox Code Playgroud)

简单地做Mysql2::Client.new(config)就行不通,因为它不会拿起用户名和密码.

ruby yaml mysql2

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

具有Core Data关系的iOS 8 Swift NSFetchResult谓词无法访问内部ID

对核心数据很新,但我读过我可以获取使用实体关系的数据.现在,来自Mysql可能我做了太多的假设,但我有2个实体设置了它们之间的关系,我无法获取正确的数据.

这是我的2个型号:

@objc(Categories)
class Categories: NSManagedObject {
    @NSManaged var category: String
    @NSManaged var exp: String
    @NSManaged var order: NSNumber
}

@objc(Techniques)
class Techniques: NSManagedObject {
    @NSManaged var korean: String
    @NSManaged var order: NSNumber
    @NSManaged var spanish: String
    @NSManaged var categories: Categories
}
Run Code Online (Sandbox Code Playgroud)

在我创建从技术到类别的关系后,Core Data将此字段添加到Sqlite DB:

ZCATEGORIES - INTEGER
Run Code Online (Sandbox Code Playgroud)

假设我想获取属于类别#3的所有技术(内部ZID:3)

如果我这样做:

request.predicate = NSPredicate(format: "categories == %@", 3)
Run Code Online (Sandbox Code Playgroud)

有用.但如果我这样做:

request.predicate = NSPredicate(format: "categories == %@", category.category)
Run Code Online (Sandbox Code Playgroud)

它不起作用.我知道它不起作用,因为它category.category是一个String,而不是一个Integer.

我的问题是:

我是否必须在类别实体中创建自己的关系ID字段并设置它,然后引用技术,如:

request.predicate = NSPredicate(format: "categories == %@", category.categoryID)
Run Code Online (Sandbox Code Playgroud)

是否有办法访问类别的内部ID以使这种关系起作用?

或者更好的是,在我看来应该有一个内部机制来检索这些关系,而无需编写类似SQL的查询,只需使用Object,如: …

nsfetchedresultscontroller ios swift

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

Rails为什么在你有git post-receive hook时使用capistrano?

我根本不熟悉Capistrano,我刚读了一些关于配置它的基本帖子.但我的问题是,如果你可以使用git post-receive钩子部署你的Rails应用程序文件,为什么要打扰Capistrano呢?

Capistrano提供的钩子不是什么?

我正在研究在不使用FTP的情况下部署我的Rails应用程序的自动化方法,并且遇到了git hooks和Capistrano.

或者我错过了什么?

谢谢.

git capistrano ruby-on-rails

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

Ruby删除哈希数组中的重复条目,但基于多个值

我已经看到了很多关于这个的问题,但只有一个键,从不用于多个键.

我有以下哈希数组:

a = [{:name=>"Yes, Yes, Yes", :artist=>"Some Dude", :composer=> 'First Dude', :duration=>"3:21"},
 {:name=>"Chick on the Side", :artist=>"Another Dude", :duration=>"3:20"},
 {:name=>"Luv Is", :duration=>"3:13"},
 {:name=>"Yes, Yes, Yes", :artist=>"Some Dude", :composer=> 'First Dude', :duration=>"2"},
 {:name=>"Chick on the Side", :artist=>"Another Dude"}]
Run Code Online (Sandbox Code Playgroud)

a.uniq在这里不起作用,因为持续时间不同或甚至不存在.我在数据库中设置了一个唯一的密钥,不允许使用相同名称,艺术家和作曲家的重复条目,因此当人们对这3个密钥有重复的条目时,我有时会遇到错误.

有没有办法运行uniq,检查这3个键?我试过像这样的块:

 new_tracks.uniq do |a_track|
   a_track[:name]
   a_track[:artist]
   a_track[:composer]
 end
Run Code Online (Sandbox Code Playgroud)

但是忽略了密钥不存在的任何东西(没有作曲家的任何条目都不符合上述标准).

我总是可以只使用:name密钥,但这意味着我将摆脱具有相同标题但不同的艺术家或作曲家的编辑中的潜在有效曲目.

这是Ruby 2.0.

ruby activerecord ruby-on-rails ruby-2.0

6
推荐指数
3
解决办法
7873
查看次数

运行查询时,Rails显示进度栏

我有几个MySQL查询需要很长时间,并且我想在它们运行时显示进度条。这可能在Rails中使用jquery吗?ActiveRecord对此有任何机制吗?

真?没有主意吗 然后呢:

我有按行分隔的查询,(connection.execute)是否可以调用类似于查询调用之间的进度条的东西?

ruby-on-rails-3.1

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

Rails(ActiveRecord)合并或如何仅更新表中的空值

使用Mysql,我可以使用COALESCE只更新表中的emtpy值.

如何使用Rails(ActiveRecord)执行此操作?

我不想为if表中的每一列创建语句,并且我猜想如果我将ActiveRecord哈希传递给update_attributes方法,必须有一种方法.

谢谢.

activerecord padrino ruby-on-rails-3.2

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