Tag: activerecord

Rails方法容易受到SQL注入?

什么是易受SQL注入攻击的Rails方法,以什么forms? 例如,我知道字符串参数容易受到攻击: Model.where(“name = #{params[:name}”) # unsafe 但参数化字符串或哈希不是: Model.where(“name = ?”, params[:name]) # safe Model.where(name: params[:name]) # safe 我主要想知道在where , order , limit和joins ,但想知道任何其他可能是攻击向量的方法。

仅在成功保存父对象时才将更改保存到has_many关联?

假设每个Project都有很多Tasks 。 如果我做 some_project.tasks = list_of_tasks some_project.save 即使保存失败,项目的任务也会更新。 如果list_of_tasks包含新记录,即使保存失败,项目的任务也会被删除 ! 哇! 如果保存失败,项目应该具有与我开始搞乱之前相同的任务。 我如何得到这种行为,为什么不是默认行为?

为什么Rails隐藏了id列的存在?

我不太明白需要隐藏Rails中id列的存在。 它既不反映在migration文件中,也不反映在schema.rb文件中。 新手无法知道默认情况下已创建名为id的列作为primary key 。 除非他们去检查数据库中表的实际模式( rails dbconsole )。 我可以在迁移文件和schema.rb看到默认包含的timestamps宏,它包含两个字段created_at和updated_at 。 在这里,开发人员至少得到一个线索。 Rails也可以为id列做同样的事情。 但事实并非如此。 为什么id列周围的秘密? 它是着名的convention over configuration的一部分吗? 或者它是所有MVC框架的标准吗?

是否有一个干净的API用于在ActiveRecord中的’reload’上重置实例变量?

在ActiveRecord::Base模型中,只要我设置的属性映射到表列,我就可以将模型的状态重置为从reload数据库时的状态: user = User.first user.email #=> “email@domain.com” user.email = “example@site.com” user.email #=> “example@site.com” user.reload user.email #=> “email@domain.com” 但是,如果我添加一个自定义属性,我发现让它行为相同的唯一方法是这样的: class User < ActiveRecord::Base attr_accessor :user_agent def reload super self.user_agent = nil self end end 我的问题是,是否有一些API可以在重新加载时重置非数据库列属性? 就像是: class User < ActiveRecord::Base # this reloadable_attr_accessor :user_agent # or this def user_agent @user_agent end def user_agent=(value) set_instance_var_that_resets_on_reload("@user_agent", value) end […]

Ruby On Rails – 同一个表之间的多对多

我试图在Rails中创建一个有点复杂的关系,并且在找到最佳方法时遇到一些麻烦。 我有一个Users表,其中每个用户都充当教师和学生。 我想有一个has_many“学生”(也只是用户)和一个has_many“老师”(也只是用户)。 我不想做任何子类或单表inheritance。 我想在用户之间想要两个不同的many_to_many。 做这个的最好方式是什么? 这是一个坏主意吗? 有更好的解决方案吗?

如何计算ActiveRecord .group查询的结果? 链接.count返回一个哈希值

我可以使用以下内容: User.where(“zip_code = ‘48104’”).group(‘users.id’).count 得到如下的哈希: {195=>1, 106=>1, 120=>1, 227=>1, 247=>1, 264=>1, 410=>1} 有没有办法可以计算这些哈希值,只返回7 ,而不是上面的结果? 我知道在上面的场景中这没有意义,我可以通过不使用group子句来实现。 但我正在研究一个更复杂的查询,我需要实现它。 提前致谢。

链接命名范围不按预期工作

我有2个简单的命名范围定义如下: class Numbers {:title => [‘2′,’4′,’6’]} named_scope :odd, :conditions => {:title => [‘1′,’3′,’5’]} end 如果我打电话给Numbers.even我回来2,4,6这是正确的,如果我打电话给Numbers.odd我回来1,3,5这是正确的 当我将它们链接在一起时,这样:Numbers.even.odd我得到1,3,5因为这是我引用的最后一个范围。 所以,如果我说Numbers.odd.even,我实际上会得到2,4,6。 当我将它们连在一起时,我希望得到1,2,3,4,5,6。 我尝试的另一种方法是: named_scope :even, :conditions => [“title IN (?)”, [‘2’, ‘4’,’6′]] named_scope :odd, :conditions => [“title IN (?)”, [‘1’, ‘3’,’5′]] 但是当我将它们链接在一起时,我得不到任何结果,因为它创建的查询看起来像这样: SELECT * FROM `numbers` WHERE ((title IN (‘1′,’3′,’5’)) AND (title IN (‘2′,’4′,6′))) ‘AND’子句应该改为OR,但我不知道如何强迫它。 这可能是ActiveRecord的问题吗?

Rails里面有LIKE和数组

我怎么能这样做? myarray = [“name1″,”name2”] Product.where(‘name ILIKE ?’, %#{myarray}%) 我需要获得名称如name1和name2所有产品。 这可能吗?

Rails – 更改关联不会将对象标记为脏

编辑 :澄清添加 鉴于以下两个类 class Foo < ActiveRecord::Base belongs_to :bar end class Bar < ActiveRecord::Base end 当我更改foo上的一个栏时,我想要一种方法来查看foo实例已经改变: foo = Foo.find(x) foo.bar # returns # foo.bar = Bar.new foo.changed? # returns false foo.changes # returns an empty hash 我不想将bar_id设置为脏(因为它没有改变)。拥有以下内容会很好: foo.changed? # returns true foo.changes # returns {:bar => [#, nil]} 是否有一种聪明的方法可以将其破解为Rails? 有没有理由这不是Rails的一部分?

使用activerecord如何根据字段的最高值选择记录?

我遇到了一些我不知道如何处理活动记录(实际上我不能确切地说如何用sql做)我想做的事情。 我想根据某个字段的最高值以及其他一些标准选择记录。 下面是一些伪造的东西,它解释了我的情况。 鉴于以下记录: id:1 | name:recipe1 | saved:true | revision:1 id:2 | name:recipe1 | saved:false | revision:2 id:3 | name:recipe1 | saved:true | revision:3 id:4 | name:recipe1 | saved:false | revision:4 id:5 | name:recipe2 | saved:true | revision:1 id:6 | name:recipe2 | saved:true | revision:2 id:7 | name:recipe3 | saved:false | revision:1 id:8 | […]