ActiveRecord按字段比较选择

时间:2016-11-24 18:58:39

标签: ruby-on-rails ruby activerecord rails-activerecord

我试图选择两个字段没有相同值的记录。 (其中字段A与字段B的值不同)。这涉及alias_attributes。我希望能够使用别名而不是神秘的数据库名称,以便可以从数据库名称中隔离rails代码。

型号:

alias_attribute :item_amount, :fielda
alias_attribute :item_applied_amount, :fieldb

此代码有效:

  query = where('fielda != fieldb')

但我宁愿有类似的东西:

query = where.not(item_amount: item_applied_amount:)

2 个答案:

答案 0 :(得分:3)

恕我直言,你不能这样做,因为数据库对模型中定义的别名一无所知。

此外,即使别名有效,$cust = $_POST['addCustomer']; $addMake = $_POST['addMake']; $addModel = $_POST['addModel']; $addYear = $_POST['addYear']; $addGross = $_POST['addGross']; $subSale = $_POST['subSale']; $soldDate = date('m/d/yy'); if(isset($subSale)){ $sql = "INSERT INTO `$sold_table` ( `Id`,`Customer`, `Year`, `Make`, `Model`, `FrontGross`, `SoldDate` ) VALUES (NULL,'$cust', '$addYear', '$addMake', '$addModel', '$addGross', '$soldDate')"; if (mysqli_query($conn, $sql)) { echo 'success!'; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } } 也会在SQL中转换为where(item_amount: :item_applied_amount)。这意味着:fielda = 'fieldb'列的值必须等于字符串fielda(不是列"fieldb"的值)

但您可以使用fieldb获取原始名称并使用返回的字符串构建正确的查询:

attribute_alias(name)

或者您可能想要定义范围以提高可读性:

where(
  "#{attribute_alias(:item_amount)} != #{attribute_alias(:item_applied_amount)}"
)

并像这样使用它:

scope :without_matching_amounts, -> { where('fielda != fieldb') }

答案 1 :(得分:0)

就像@spickermann所说,alias执行ruby方法别名,不在SQL中创建别名。

你可以做的是创建别名:

scope :with_aliases, -> {
  select('table.*, table.item_amount as fielda, table.item_applied_amount as fieldb')
}

然后执行以下操作:

Model.with_aliases.where('fielda <> fieldb')