我试图选择两个字段没有相同值的记录。 (其中字段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:)
答案 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')