弄清楚如何从这个SQL查询创建一个named_scope有点困难:select*fromfoowhereidNOTIN(selectfoo_idfrombar)ANDfoo.category=?按RAND()限制1排序;类别应该是可变的。针对上述问题编写命名范围的最有效方式是什么? 最佳答案 named_scope:scope_name,lambda{|category|{:conditions=>["idNOTIN(selectfoo_idfrombar)ANDfoo.category=?",category],:order=>'
在Rails3.1中,我想通过使用接受参数数据的create方法来创建一个嵌入式对象,但我想知道是否有比下面的case方法更优雅的方法:defmethod_call(obj,data)caseobjwhen'a'thenUser.create_a(data)when'b'thenUser.create_b(data)when'c'thenUser.create_c(data)endend我真的很想做类似下面的事情,但是由于我传递的数据,这会导致错误:defmethod_call(obj,data)User.send("create_#{obj}")(data)end有什么建议吗?提前致
我创建了一个使用以下函数的网络框架:defto_class(text)text.capitalizetext.gsub(/(_|-)/,'')end将snake_cased或hyphen-cased的目录名称转换为项目的PascalCased类名。问题是,该函数只删除了_和-,并没有将下一个字母大写。使用.capitalize或.upcase是否有办法将您的snake/hyphen_/-cased名称转换为正确的PascalCased类名? 最佳答案 gsub(/(?:^|[_-])([a-z])?/){$1.upcaseunles
我正在根据散列值分配一组值。我必须根据传入哈希键的值将值分配给另一个哈希键。传入的哈希中有超过10个键(因此超过10个案例)。我想最小化代码。对于这种情况,是否有其他方法可以缩短代码。@hash1.eachdo|h1|caseh1.mapped_fieldwhen'value1'@hash2[h1.field_id]=value_1when'value2'@hash2[h1.field_id]=value_2when'value3'@hash2[h1.field_id]=value_3when'value4'@hash2[h1.field_id]=value_4when'value5'
想象一下下面的代码:classSimpleLetterdefvalues("a".."z").to_aenddef===(other)values.include?(other)endendclassVowel我本可以选择任何其他类(class),我只是以它们为例。我非常喜欢Scala的match和提取器,我认为这可能是用Ruby编写相同内容的好方法。有没有更好的方法来编写上面的代码而不必实例化新对象以便我可以调用它们的===方法?为了避免不必要的帖子,是的,我知道我可以这样做:caseletterwhen["a","e","i","o","u"].include?(letter)#.
我想简化在多个条件适用时执行单个操作的代码。这是一个简化的示例:casebuttonwhen'up','upper-right','right','lower-right','down','lower-left','left','upper-left'move_direction(button)elsedo_something_elseend如果我可以将这些选项封装到类或常量之类的东西中,那将会很有帮助,但我不确定该怎么做,或者是否有可能。如何封装这些条件? 最佳答案 您可以只使用数组splat。VALID_DIRECTION=%w
使用50个if-else语句对于一项操作来说是否过于耗费资源?我正在做这样的事情:ifteam.players.count>1assign_team_type(..)elsifteam.players.count>3assign_team_type(..)...etc....end此外,将50个if-else语句放在Controller内的create操作中而不是after_create方法是否更有效?还是改用caseswitch语句或完全避免使用它会更有效?编辑:感谢您的快速回复!该代码用于社区体育锦标赛,根据该队的球员人数分配球队。我正在尝试编写一些东西,根据添加到该团队的玩家数量
我是一个Ruby新手。我怎样才能为这个功能写得更好?我可以改用哈希表吗?defreadable_status(status)ifstatus=="1"return"go"endifstatus=="2"return"stop"endifstatus=="3"return"die"endend 最佳答案 如果您想使用散列(根据您的问题),您可以这样做:defreadable_status(status)readable={"1"=>"go","2"=>"stop","3"=>"die"}readable[status]||"defau
我是一位经验丰富的程序员,正在学习Ruby(并且非常喜欢它)。我正在使用SQLite3设置数据库。为了更好地学习Ruby,我正在跟踪SQLite3。我不明白的是,数据库和语句类的#new代码在哪里。实际上,我期望的不是#new方法,而是#initialize方法。SQLite3::Database.new(file,options={})SQLite3::Statement.new(db,sql)以上两句来自文档。但是在我的代码中,当我试图追踪到这个时$db=SQLite3::Database.new"MyDBfile"它刚刚跨过。然后稍后当我尝试追踪#$db.execute我确实进入
我已经开始学习Ruby。我有一个构建游戏的小项目,并尝试创建一个函数来接收用户输入并相应地处理它。defGame.listenerprint">"whilelisten=$stdin.gets.chomp.downcasecaselistenwhen(listen.include?("navigate"))puts"Navigateto#{listen}"breakwhen($player_items.include?(listen))Items.use(listen)breakendputs"Notaoption"print">"endend但是,case语句无法检测到我输入了nav