天道酬勤,学无止境

Ignoring certain field when querying in Rails and ActiveRecord

I know that I can specify certain fields to query the database with pluck.

ids = Item.where('due_at < ?', 2.days.from_now).pluck(:id)

However I would like to know, whether there is a way to specify certain fields I would like to avoid querying from the db. Some kind of anti-pluck?

  posts = Post.where(published: true).do_not_lookup(:enormous_field)

评论

Model#attribute_names should return array of columns/attributes. You can exclude some of them and pass to pluck or select methods.

Something like this:

posts = Post.where(published: true).select(Post.attribute_names - ['enormous_field'])

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • using lambda in find in rails
    I have a method that does a paginated find call like.. 1 coll = paginate(:all, lambda {{:conditions => ['status = ? AND expires < ?', 'a', DateTime.now]}}, :select => Constants::POST_FIELDS, :order => 'posts.ratings DESC', :include => [{:poster => :poster_friends}, :category], :per_page => Constants::LISTINGS_PER_PAGE, :page => page) When this call runs it simply ignores the conditions in the generated query. 2 If I try it in a named_scope I get an error like.. named_scope :featured_all, lambda {{:conditions => ['status = ? AND expires < ?', 'a', DateTime.now], order => 'posts.ratings DESC',
  • 在 Rails 中查找时使用 lambda(using lambda in find in rails)
    问题 我有一个方法可以进行分页查找调用,例如.. 1 coll = paginate(:all, lambda {{:conditions => ['status = ? AND expires < ?', 'a', DateTime.now]}}, :select => Constants::POST_FIELDS, :order => 'posts.ratings DESC', :include => [{:poster => :poster_friends}, :category], :per_page => Constants::LISTINGS_PER_PAGE, :page => page) 当此调用运行时,它会忽略生成的查询中的条件。 2 如果我在 named_scope 中尝试它,我会收到类似的错误.. named_scope :featured_all, lambda {{:conditions => ['status = ? AND expires < ?', 'a', DateTime.now], order => 'posts.ratings DESC', :include => [{:poster => :poster_friends}, :category], :select => Constants::POST_FIELDS}} 命名范围错误:
  • Elegant PostgreSQL Group by for Ruby on Rails / ActiveRecord(Elegant PostgreSQL Group by for Ruby on Rails / ActiveRecord)
    问题 尝试使用 PostgreSQL 检索按日期分组的 ActiveRecord 对象数组。 更具体地说,我正在尝试翻译以下 MySQL 查询: @posts = Post.all(:group => "date(date)", :conditions => ["location_id = ? and published = ?", @location.id, true], :order => "created_at DESC") 我知道 PostgreSQL 对 SQL 标准的解释比 MySQL 更严格,因此这种类型的查询将不起作用......并且已经阅读了有关 StackOverflow 和其他主题的许多帖子 - 但似乎没有一个是关于这个问题的最终答案 我已经尝试过使用 group by 和不同的子句进行查询的各种组合,但没有太多乐趣 - 目前我有一个相当不雅的 hack,尽管它的工作原理让我看到它时脸红了。 使用 Rails 和 PostgreSQL 进行此类查询的正确方法是什么? (忽略这肯定应该在 ActiveRecord 级别抽象掉的事实) 回答1 您要在此处使用的 PostgreSQL 功能是 DISTINCT ON。 通过 ActiveRecord 进行此查询有两种基本方法。 第一种方法是只指定:select和:order选项。 当您有一个没有:joins或
  • Rails:忽略传递给 create() 的不存在的属性(Rails: Ignoring non-existant attributes passed to create())
    问题 我有以下 Rails 模型: class CreateFoo < ActiveRecord::Migration def self.up create_table :foo do |t| t.string :a t.string :b t.string :c t.timestamps end end def self.down drop_table :foo end end 如果我尝试使用附加的不存在的属性创建新记录,则会产生错误: Foo.create(a: 'some', b: 'string', c: 'foo', d: 'bar') ActiveRecord::UnknownAttributeError: unknown attribute: d 有没有办法让 create() 忽略模型中不存在的属性? 或者,在创建新记录之前删除不存在的属性的最佳方法是什么? 非常感谢 回答1 试图想出一种可能更有效的方法,但现在: hash = { :a => 'some', :b => 'string', :c => 'foo', :d => 'bar' } @something = Something.new @something.attributes = hash.reject{|k,v| !@something.attributes.keys.member?(k.to_s)
  • Rails ActiveRecord friendly code from a Complex Join, Sum, and Group query
    PROBLEM Hello, I am having no luck trying to break down this SQL statement into ActiveRecord/Rails friendly code and I'd like to learn how I can avoid a find_by_sql statement in this situation. Scenario I have users that create audits when they perform an action. Each audit is of a specific audit_activity. Each audit_activity is worth a certain number of points, based on score_weight. I need to find the total scores of each user, based on their total accumulated audit_activity score_weights. Eventually I'll need to rank them which means adding a sort to this as well. My Code Here is my sql and
  • 来自复杂连接、求和和组查询的 Rails ActiveRecord 友好代码(Rails ActiveRecord friendly code from a Complex Join, Sum, and Group query)
    问题 问题 你好, 我在尝试将此 SQL 语句分解为 ActiveRecord/Rails 友好代码时没有运气,我想了解如何在这种情况下避免使用 find_by_sql 语句。 场景我有用户在执行操作时创建审核。 每个审计都属于特定的 audit_activity。 根据 score_weight,每个 audit_activity 都值得一定数量的积分。 我需要找到每个用户的总分,基于他们累计的 audit_activity score_weights。 最终我需要对它们进行排名,这意味着也要为此添加一个排序。 我的代码这是我的 sql 和相关表的简化版本。 有什么想法吗? 带有完整列名的 SQL(为了清楚起见) SELECT users.id, u.email, SUM(audit_activity.score_weight) FROM users JOIN audits ON users.id = audits.user_id JOIN audit_activities ON audit_activities.id = audits.audit_activity_id GROUP BY users.id; 模型:用户、审计、审计活动 用户字段:id、email class User < ActiveRecord::Base include Clearance::User
  • 使用敏感信息(如密码)导轨保护数据库列(protecting Database columns with sensitive information (like passwords) rails)
    问题 我有一个 rails 应用程序,它像许多 rails 应用程序一样,拥有用户。 在我的用户模型中,我有password和salt列等。 有什么办法可以防止这些在我debug @user或渲染JSON ? 当然,我可以确保每次使用时都省略这些,但是有没有办法真正确保它们不会出现在任何地方? 也许他们可以是私人领域? 它们只在我的User模型和Session控制器中需要,但我可以在User中创建一个方法,将给定的密码与正确的密码进行比较,然后只能在“用户”模块中访问变量。 这会有所帮助,还是仍然会在这两个地方(和其他地方)呈现? 回答1 很好的问题,有几点需要考虑: 您是否希望将模型或Rails 核心中的值“私有化”? 您是否需要在任何特定情况下访问这些属性? (即他们总是私人的吗?) 如何填充私有方法? 他们会改变吗? 我必须诚实地说我不知道​​答案。 因为我有兴趣,我做了一些研究。 以下是一些资源: 有没有办法将 Rails ActiveRecord 属性设为私有? 在 ActiveRecord 模型中隐藏属性 ActiveRecord 保护您的隐私 共识似乎是,如果您采用 Rails模型,并应用每次填充它时其属性成为 的实例方法的逻辑,您就可以开始在模型本身内私有化这些方法。 例如... #app/models/user.rb class User <
  • Ruby on rails 3 - 加入多个模型以使用来自另一个不直接相关的模型的属性更新一个模型的字段(Ruby on rails 3 - Join many models to update a field of one model using attributes from another model non related directly)
    问题 我在尝试使用另一个模型的值更新一个模型的属性时遇到问题,但这两个模型不相关。 我的模型是: class Order < ActiveRecord::Base has_many :order_details has_many :waybills end class OrderDetail < ActiveRecord::Base belongs_to :order, :foreign_key => "order_id" belongs_to :product, :foreign_key => "product_id" end class Waybill < ActiveRecord::Base has_many :purchases belongs_to :order, :foreign_key => 'order_id' end class Purchase < ActiveRecord::Base belongs_to :waybill, :foreign_key => 'waybill_id' has_many :detail_purchases end class DetailPurchase < ActiveRecord::Base belongs_to :purchase, :foreign_key => 'purchase_id' belongs_to
  • Elegant PostgreSQL Group by for Ruby on Rails / ActiveRecord
    Trying to retrieve an array of ActiveRecord Objects grouped by date with PostgreSQL. More specifically I'm trying to translate the following MySQL query: @posts = Post.all(:group => "date(date)", :conditions => ["location_id = ? and published = ?", @location.id, true], :order => "created_at DESC") I am aware that PostgreSQL interpretation of the SQL standard is stricter than MySQL and that consequently this type of query won't work...and have read a number of posts on StackOverflow and elsewhere on the subject - but none of them seem to be the definitive answer on this subject I've tried
  • 在Rails开发中如何忽略延迟的作业查询日志(How to ignore Delayed Job query logging in development on Rails)
    问题 如何从log / development.log中静默/忽略这些“延迟的作业”查询日志? Delayed::Backend::ActiveRecord::Job Load (1.0ms) UPDATE "delayed_jobs" SET locked_at = '2013-11-19 19:55:45.053991', locked_by = 'host:desktop-virtual pid:22277' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at <= '2013-11-19 19:55:45.053435' AND (locked_at IS NULL OR locked_at < '2013-11-19 15:55:45.053519') OR locked_by = 'host:desktop-virtual pid:22277') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * Delayed::Backend::ActiveRecord::Job Load (1.4ms) UPDATE "delayed_jobs" SET locked_at = '2013
  • 经过一定时间后,Rails 更新数据库(Rails update database after certain amount of time has gone by)
    问题 如果一本书是在 25 秒前创建的(部署时,它将是 7 天前,但我不能等那么久:)),我正在尝试更新我数据库中的一列。 楷模: class Book < ActiveRecord::Base attr_accessible :author, :date, :description, :order, :title, :user_id, :author, :status, :queued belongs_to :user end class User < ActiveRecord::Base attr_accessible :email, :password, :password_confirmation, :remember_me, :user_id, :name, :bio has_many :books end 控制器: class UsersController < ApplicationController def show @user = User.find(params[:id]) @book = Book.new @books = Book.select("DISTINCT name, id") # Not used right now @sequence = @user.books @sequence.each do |book| book.created_at
  • ActiveRecord find_each结合限制和顺序(ActiveRecord find_each combined with limit and order)
    问题 我正在尝试使用ActiveRecord的find_each方法运行大约50,000条记录的查询,但是它似乎忽略了我的其他参数,如下所示: Thing.active.order("created_at DESC").limit(50000).find_each {|t| puts t.id } 除了要在50,000处停下来created_at排序之外,这是在整个数据集上执行的结果查询: Thing Load (198.8ms) SELECT "things".* FROM "things" WHERE "things"."active" = 't' AND ("things"."id" > 373343) ORDER BY "things"."id" ASC LIMIT 1000 有没有一种方法可以使find_each得到类似的行为,但是有一个最大最大限制并find_each我的排序标准? 回答1 该文档说find_each和find_in_batches不保留排序顺序和限制,因为: 在PK上对ASC进行排序可用于进行批量订购。 限制用于控制批次大小。 您可以像@rorra一样编写此函数的自己的版本。 但是在对对象进行变异时会遇到麻烦。 例如,如果按created_at排序并保存对象,则可能在下一批中再次出现该对象。 同样,您可能会跳过对象,因为在执行查询以获取下一批时
  • Ruby on Rails:在单个数据库单元格中保存多个值(Ruby on Rails: Saving multiple values in a single database cell)
    问题 如何在 Ruby on Rails 应用程序的单个单元格记录中保存多个值? 如果我有一个名为Exp的表,其列名为: Education 、 Experience和Skill ,如果我希望用户在一行中存储多个值(例如:教育机构或技能),最佳做法是什么? 我想让用户使用多个文本字段,但应该进入相同的单元格记录。 例如,如果用户有多个技能,这些技能应该在一个单元格中吗? 如果我为技能创建一个新表,这是最好的还是更好? 请指教, 谢谢 回答1 我不建议在同一个数据库列中存储多个值。 这会使查询变得非常困难。 例如,如果您想查找具有特定技能集的所有用户,则查询在可读性和性能方面都会很笨拙。 但是,在某些情况下它仍然有意义。 当您想要允许数据点的可变列表时您不会根据列表中的值之一查询数据 ActiveRecord 对此有内置支持。 您可以将Hash或Array存储在数据库列中。 只需将列标记为Text rails g model Exp experience:text education:text skill:text 接下来,序列化Model代码中的列class Exp < ActiveRecord::Base serialize :experience, :education, :skill # other model code end 现在
  • ElasticSearch,Tire和嵌套查询/与ActiveRecord的关联(Elasticsearch, Tire, and Nested queries / associations with ActiveRecord)
    问题 我在将ElasticSearch与Tire一起使用来索引和搜索一些ActiveRecord模型,并且一直在寻找索引和搜索关联的“正确”方法。 我还没有找到最佳解决方案,因此我想问问是否有人采用他们认为确实有效的方法。 作为一个示例设置(已完成,但说明了问题),假设我们有一本书,其中包含章节。 每本书都有标题和作者,以及许多章节。 每章都有文字。 我们希望为书的字段和章节的文本建立索引,以便您可以按作者搜索书,也可以搜索其中包含某些单词的任何书。 class Book < ActiveRecord::Base include Tire::Model::Search include Tire::Model::Callbacks has_many :chapters mapping do indexes :title, :analyzer => 'snowball', :boost => 100 indexes :author, :analyzer => 'snowball' indexes :chapters, type: 'object', properties: { chapter_text: { type: 'string', analyzer: 'snowball' } } end end class Chapter < ActiveRecord::Base
  • ActiveRecord 查找开始于(ActiveRecord find starts with)
    问题 非常简单的问题 - 我如何搜索以查找名称以 ActiveRecord 中某个字符串开头的所有记录。 我已经在互联网上看到了使用逐字 LIKE SQL 子句的各种位 - 但据我所知,这不是“正确”的做法。 有“合适的”Rails 方式吗? 回答1 我强烈推荐 Searchlogic 插件。 然后就这么简单: @search = Model.new_search(params[:search]) @search.condition.field_starts_with = "prefix" @models = @search.all Searchlogic 很聪明,就像 ActiveRecord 一样,可以在starts_with条件中选取字段名称。 它还将处理所有分页。 此方法将有助于防止 SQL 注入,并且与数据库无关。 Searchlogic 最终会根据您使用的数据库适配器以不同方式处理搜索。 您也不必编写任何 SQL! Searchlogic 有很好的文档并且易于使用(我自己是 Ruby 和 Rails 的新手)。 当我卡住时,插件的作者甚至在几个小时内直接回复了一封电子邮件,帮助我解决了问题。 我不能推荐足够多的 Searchlogic ......正如你所知道的。 回答2 如果您想在数据库中进行搜索,那么您需要使用 SQL。 而且,当然,您需要在数据库中进行搜索
  • Using ActiveRecord to achieve complex relations in Rails
    From another question of mine: What I need to achieve is this: Create multiple categories with their own designated information fields (ie. Cars have different fields from Pets) and once such a category is created, the commands I need will be invoked and a new table for each category will be made. I know I could store all fields as some sort of string and then process it to display it properly, but I need a advanced search function for my web app and creating separate tables for each category seems the best way to achieve it. I would really like to hear alternatives for this So I have this
  • 在 rails 中转义 SQL LIKE 查询(escaping query for SQL LIKE in rails)
    问题 在 Rails 源(https://github.com/rails/rails/blob/fe4b0eee05f59831e1468ed50f55fbad0ce11e1d/activerecord/lib/active_record/sanitization.rb#L112)中有一个sanitize_sql_like方法(我希望在使用它们之前对字符串进行消毒)一个 SQL LIKE 但是,我似乎无法使用它,因为 Rails 说该方法不存在。 我的字符串中有一个撇号,查询是 @query = "Joe's" Model.where("lower(field) LIKE ?", "%#{@query}%") 使用ActiveRecord::Base.sanitize没有帮助,因为查询没有结果。 如何转义@query并保证我的 SQL 安全? 回答1 我已经使用 ActiveRecord::Sanitization::ClassMethods 解决了同样的问题(在 MySQL 上)以正确清理用户输入。 不幸的是, ActiveRecord::Sanitization::ClassMethods 中定义的方法被声明为protected ,因此它们只能在 Model 类的范围内访问。 ActiveRecord::Sanitization::ClassMethods
  • Rails中使用ActiveRecord实现复杂关系(Using ActiveRecord to achieve complex relations in Rails)
    问题 来自我的另一个问题: 我需要实现的是:创建多个具有自己指定信息字段的类别(即汽车具有与宠物不同的字段),一旦创建了这样的类别,我需要的命令将被调用,每个类别的新表将被制作。 我知道我可以将所有字段存储为某种字符串,然后对其进行处理以正确显示它,但是我需要为我的 Web 应用程序提供高级搜索功能,并且为每个类别创建单独的表似乎是实现它的最佳方式。 我真的很想听到这个的替代方案 所以我有这种情况,我需要类别来保存该特定类别所需的所有输入字段。 所以在管理中,我有这个表单,我可以在其中添加类别名称、其他一些相关信息到类别本身,然后这些字段将收集有关在制作时呈现给用户的HTML 字段的信息进入这个特定类别。 例如,这将是一个 Dog 类别: 分类名称: 狗已启用类别:1 类别父:宠物领域: 标题 - 文本字段(将自动添加到每个类别) 品种 - 选择字段年龄 - 数字字段颜色 - 文本字段价格 - 数字字段(将自动添加到每个类别) 说明 - 文本区域字段(将自动添加到每个类别) 所以现在在这个阶段,当用户为 Dog 类别创建所有这些特定字段时,我无法确定当用户点击提交按钮以保存该类别时会发生什么。 我想到了这两个解决方案: 为每个新类别创建一个新模型/表(阅读上面的链接问题),将所有 HTML 字段作为列,并在categories表上存储一行
  • ActiveRecord :includes - how to use map with loaded associations?
    I have a small rails app, and I'm trying to get some order statistics. So I have an Admin model, and an Order model, with one-to-many association. class Admin < ActiveRecord::Base attr_accessible :name has_many :orders class Order < ActiveRecord::Base attr_accessible :operation belongs_to :admin And I'm trying to get specifical orders using this query: admins = Admin.where(...).includes(:orders).where('orders.operation = ?', 'new gifts!') That works just as expected. But when I try to make json using map like that admins.map {|a| [a.name, a.orders.pluck(:operation)]} Rails loads orders again
  • ActiveRecord :includes - 如何使用地图加载关联?(ActiveRecord :includes - how to use map with loaded associations?)
    问题 我有一个小的 rails 应用程序,我正在尝试获取一些订单统计信息。 所以我有一个 Admin 模型和一个 Order 模型,具有一对多的关联。 class Admin < ActiveRecord::Base attr_accessible :name has_many :orders class Order < ActiveRecord::Base attr_accessible :operation belongs_to :admin 我正在尝试使用此查询获取特定订单: admins = Admin.where(...).includes(:orders).where('orders.operation = ?', 'new gifts!') 这正如预期的那样工作。 但是当我尝试使用这样的地图制作 json 时 admins.map {|a| [a.name, a.orders.pluck(:operation)]} Rails 使用新查询再次加载订单,忽略已加载的对象。 (5.6ms) SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 26 (6.8ms) SELECT "orders"."operation" FROM "orders" WHERE "orders"