【问题标题】:My join table doesn't seem to be working我的联接表似乎不起作用
【发布时间】:2011-07-26 14:56:12
【问题描述】:

我的模型:

class CardSignup < ActiveRecord::Base
  has_one :conversion
  has_one :card_signup, :through => :conversion

class User < ActiveRecord::Base      
  has_many :conversions
  has_many :card_signups, :through => :conversions

class Conversion < ActiveRecord::Base
  belongs_to :card_signup
  belongs_to :user
end

我的迁移:

class AddCardSignupConversions < ActiveRecord::Migration
  def self.up
    create_table (:conversions, :id => false) do |t|
      t.integer :user_id
      t.integer :card_signup_id
    end
  end

  def self.down
    drop_table :conversions
  end
end

现在,我可以成功查找了:

User.find(x).conversions
CardSignup.find(x).conversion

但是,我无法向这些链接添加任何对象。不知道为什么..我试过这个:

User.last.conversions << CardSignup.last

返回:

ActiveRecord::AssociationTypeMismatch: Conversion(#2183228680) expected, got CardSignup(#2183113520)

这是为什么呢?

【问题讨论】:

    标签: mysql ruby-on-rails model


    【解决方案1】:

    为什么在转换表中将键声明为字符串?通常使用整数。这可能是导致问题的原因

    t.string :user_id
    t.string :card_signup_id

    编辑: 此外,您正在尝试将 CardSignup 添加到转换关联。这绝对行不通。顺便说一句:错误也一样。

    【讨论】:

    • 使用references 迁移助手例如:t.references :user
    • 同样的错误:ActiveRecord::AssociationTypeMismatch: Conversion(#2184375980) expected, got CardSignup(#2183621000)。还 t.references 简单地创建了 t.integer :user_id
    • 正如我之前所说的,基本错误是您试图将 CardSignup 模型添加到转换数组中,这是不可能的,因为它是主要的应用程序设计缺陷。
    • 啊,那么您如何建议创建一个具有唯一名称的连接表用于连接。我必须使它独一无二,因为这两个对象已经通过不同的关联进行了相关连接。嘿,顺便感谢您的帮助 iafonov。
    【解决方案2】:

    好的,我明白了!

    class CardSignup < ActiveRecord::Base
      # add_column :card_signups, :converted_by, :integer   # Add this to your migration
      belongs_to :converted_by, :class_name => "User"
    
    class User < ActiveRecord::Base
      has_many :conversions, :foreign_key => :converted_by, :class_name => "CardSignup"
    

    这使我可以为这种关系拥有自己的唯一名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多