ruby 如何消除rails中不明确的列名错误

ibps3vxo  于 2023-01-30  发布在  Ruby
关注(0)|答案(1)|浏览(103)

我联接了2个表(Modes和Prices),需要从这两个表中获取数据,但我得到了错误的不明确列名'min_weight'。如何指定它们以消除此错误?

表格

Modes: id, name, min_weight, max_weight, fixed_fee
Prices: id, min_weight, max_weight, price_per_km, mode_id

查询

@prices = Price.all.where(mode_id: @modes.ids).where('min_weight <= ?', @products_weight).where('max_weight >= ?', @products_weight).select("price_per_km")

@modes_prices = @modes.joins(:prices).where(prices: {id: @prices.ids}).select("modes.*, prices.price_per_km")

预期

I expect to get from @modes_prices: mode.min_weight, mode.max_weight, price.price_per_km
des4xlb0

des4xlb01#

我不知道Ruby和它的语法,但是你得到的错误在SQL中是相对“频繁”的。它说-当你从两个(或更多)表中选择列具有相同名称的行时,SQL * 引擎 * 不知道你要使用哪个表的列,它是“模糊的”。
例如,在Oracle中:

SQL> with
  2  modes (id, name, min_weight) as             --> both tables have MIN_WEIGHT
  3    (select 1, 'apple', 10 from dual),
  4  prices (id, min_weight) as                  --> column
  5    (select 1, 20 from dual)
  6  select min_weight                           --> OK, but - which one is it?
  7  from modes join prices on modes.id = prices.id;
select min_weight
       *
ERROR at line 6:
ORA-00918: column ambiguously defined

SQL>

第6行是select min_weight。它有什么问题吗?Oracle不知道您要获取哪个min_weight:是属于modes的列,还是属于prices表的列(因为它们都包含该列)?

  • 解决方案 * 是通过在列名前面加上表名(或表别名)来精确地指示SQL您想要的内容:
6  select prices.min_weight                  --> specify table name
  7  from modes join prices on modes.id = prices.id;

MIN_WEIGHT
----------
        20

SQL>

第6行现在是select prices.min_weight,很明显我想要的值属于prices表。
你也应该这样做。例如:

No : @prices = Price.all.where(mode_id: @modes.ids).where('min_weight <= ?'
Yes: @prices = Price.all.where(mode_id: @modes.ids).where('@modes.min_weight <= ?'
                                                            ------
                                                   specify table name

再一次:我不知道Ruby,这可能不是“它”,但是--根本原因 * 是 * 相同的--你应该指定表名沿着列名。

相关问题