2016-11-24 106 views
0

我试图选择两个字段没有相同值的记录。 (其中字段A与字段B不具有相同的值)。这涉及到alias_attributes。我希望能够使用别名而不是隐含的数据库名称,以便可以将rails代码与数据库名称隔离。ActiveRecord通过字段比较来选择

型号:

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

此代码的工作:

query = where('fielda != fieldb') 

但我宁愿有类似:

query = where.not(item_amount: item_applied_amount:) 

回答

3

恕我直言,你不能这样做,因为数据库知道没有关于您的模型中定义的别名。

此外,即使别名正在工作,where(item_amount: :item_applied_amount)也会转换为SQL中的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') } 

,并使用它像这样:

query = Model.without_matching_amounts 
+0

这当然更是我正在寻找,并与它的作品稍加修改其意义可以理解。 where(“#{attribute_alias(:item_amount)}!=#{attribute_alias(:item_applied_amount)}”) –

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') 
+0

对不起,如果我没有足够清楚。我试图不使用神秘的名字“fielda”和“fieldb”,因为它们在字段名称代表的内容中不清楚。 “fielda”不会告诉某人它代表“item_value”,因此乍一看很难理解。 –