【问题标题】:Rails association triggers SQL where clause with 'model'.'model_id' instead of 'model'.'id'Rails 关联使用 'model'.'model_id' 而不是 'model'.'id' 触发 SQL where 子句
【发布时间】:2016-11-23 17:41:21
【问题描述】:

在我的卡片模型中,我有以下关联:

has_many :sub_cards, ->(obj) { where('parent_card_id = ?', obj.id) },
           inverse_of: :parent_card, :class_name => 'Card'
belongs_to :parent_card, class_name: 'Card', optional: true

每当我尝试使用它们时,例如在控制台中输入 c.sub_cards,我都会收到以下错误:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'where 子句'中的'cards.card_id':SELECT cards.* FROM cards WHERE cards.card_id = 237 AND (parent_card_id = 237)

事实上,SQL 请求有'cards'.'card_id' = something,而如果我参考我的其他工作关联,它应该是'cards'.'id' = something。 问题是我找不到这种语法的来源。

有人遇到过这个问题吗?

提前感谢您的帮助。

【问题讨论】:

    标签: mysql ruby-on-rails associations


    【解决方案1】:

    您可以通过传递:foreign_key => "some_attribute_id" 来指定哪个属性是关系的外键。希望这可以帮助。祝你好运!

    编辑:

    不知道这是否适合你,但我会这样写:

    has_many :sub_cards, ->(obj) { where('parent_card_id = ?', obj.id) },
           inverse_of: :parent_card, :class_name => 'Card', foreign_key: 'parent_card_id'
    belongs_to :parent_card, class_name: 'Card', foreign_key: "parent_card_id", optional: true
    

    我认为您可以尝试一下,或者类似的方法。再次祝你好运!

    【讨论】:

    • 它没有改变任何东西,我认为不需要因为属性是关联的名称+_id,但感谢您的帮助:)
    • @V.Déhaye 编辑了我的答案...希望对您有所帮助,祝兄弟好运!
    • 不幸的是它没有帮助,因为对于belongs_to你是对的但它已经是那样了,但是对于另一种方式,必须通过查看parent_card_id属性并找到卡片来找到sub_cards指调用关联的对象,即在此字段中具有调用关联的对象的 id。不过,再次感谢您!
    • 试着留下你所拥有的,只需在你的has_many 后面加上, foreign_key: "parent_card_id"
    • 你是对的,它有效,非常感谢你!我很感激!
    猜你喜欢
    • 2014-12-23
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多