【问题标题】:Rails - querying multiple fields with boolean valuesRails - 使用布尔值查询多个字段
【发布时间】:2015-12-15 01:46:39
【问题描述】:

我有一个这样写的迁移文件:

 class Character < ActiveRecord::Migration
   def change
     create_table :character_attributes do |t|
       t.string :character_name
       t.boolean :attr1, default: false, null: false
       t.boolean :attr2, default: false, null: false
       t.boolean :attr3, default: false, null: false
       t.boolean :attr4, default: false, null: false
       t.boolean :attr5, default: false, null: false
       t.boolean :attr6, default: false, null: false
       t.boolean :attr7, default: false, null: false     
       t.timestamps null: false
     end
   end
 end

本质上,每个字符有 7 个可能的属性,但只能有一个(换句话说,如果七个字段之一为真,则其余为假)。

来自模型的其他讨论(即Rails 4.x how to query boolean value with activerecord?)查询。 但是您可以这样编写代码,以便通过对象内的多个字段/属性进行查询吗?即

 Character.find_by_character_name("Jack").where(:attributes => true) 

另外,我知道重新设计架构是一种选择,但现在我只想知道是否可以完成查询。

【问题讨论】:

  • 我很难理解您需要这种表结构的场景。看起来像一个简单的 status 枚举列就可以解决问题:api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html
  • 韦斯说了什么。简而言之,这需要是一个值为“attr1”到“attr7”的单个字段,或者它们是什么。

标签: ruby-on-rails rails-migrations ruby-on-rails-4.2 querying sqlite3-ruby


【解决方案1】:

您可以使用OR

def attributes(value)
  v = value ? 1 : 0
  <<-EOS
    attr1 = #{v} OR
    attr2 = #{v} OR
    attr3 = #{v} OR
    attr4 = #{v} OR
    attr5 = #{v} OR
    attr6 = #{v} OR
    attr7 = #{v}
  EOS
end

Character.find_by_character_name("Jack").where(attributes(true))

这可以做得更紧凑、更动态,也可以移动到模型上的类方法中。但我认为这给了你这个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多