【问题标题】:relationship belongs_to to belongs_to in ruby on railsruby on rails 中的belongs_to 到belongs_to 的关系
【发布时间】:2012-12-04 15:03:12
【问题描述】:

我在 rails 中的两个模型之间有 belongs_to 到 belongs_to 的关系。我有模型用户和模型启动

模型用户是一个设计模型(gem devise)。

这是我的代码。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :startup_name
  # attr_accessible :title, :body

  belongs_to :startup
end

这是我的启动模式

class Startup < ActiveRecord::Base
  attr_accessible :angelist, :capitalraise, :category, :country, :currentlocation, :description, :facebook, :linkedin, :name, :round, :startupchile, :twitter, :user_id
  has_one :entrepreneus, dependent: :destroy

  belongs_to :user
end

在我的架构中,我还在启动表中添加了“user_id”。

这是添加的 add_index

  add_index "startups", ["user_id"], :name => "index_startups_on_user_id"

(显然我做了迁移)

当我在第一时间创建 Startup 时,创建不带 user_id 的对象,但使用 update_attributes 在对象中添加 user_id。 (在启动控制器中)。这是代码

def create
    @startup = Startup.new(params[:startup])
    @startup.update_attributes(:user_id => current_user.id )

    respond_to do |format|
      if @startup.save
        format.html { redirect_to @startup, notice: 'Startup was successfully created.' }
        format.json { render json: @startup, status: :created, location: @startup }
      else
        format.html { render action: "new" }
        format.json { render json: @startup.errors, status: :unprocessable_entity }
      end
    end
  end

在控制台中我执行以下操作(rails c --sandbox)

u =  User.first (retrieve the user perfectly, the id is equal to 1)

u.startup (retrieve null)

但如果你这样做:

s = Startup.find_by_user_id(1) // retrieve the data

为什么我无法使用 u.startup 检索与启动相关的数据?

有什么想法吗?谢谢

PDT:抱歉,我的英语还是不太好。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    如果是两个模型之间的一对一关系,则必须在表中没有外键的一侧使用has_one。所以在这种情况下,而不是:

    belongs_to :startup
    

    你必须做的:

    has_one :startup
    

    【讨论】:

    • 添加到@Mischa 的答案,您的启动模型在attr_accessible 中声明:user_id,因此这将是具有belongs_to :user 的模型;用户将声明“has_one :startup”
    【解决方案2】:

    我是 Rails 的新手,所以如果我错了,请有人纠正我,但我不认为你可以拥有 2 个彼此“属于”的模型。 1 必须属于,1 必须有 has_many 或 has_one(编辑:根据评论,它应该是 :has_one

    我认为这可能是您正在寻找的:

    class User < ActiveRecord::Base
      # Include default devise modules. Others available are:
      # :token_authenticatable
      # :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable, :confirmable
    
      # Setup accessible (or protected) attributes for your model
      attr_accessible :email, :password, :password_confirmation, :remember_me, :startup_name
      # attr_accessible :title, :body
    
      has_one :startup # not has_many :startups
    end
    
    class Startup < ActiveRecord::Base
      attr_accessible :angelist, :capitalraise, :category, :country, :currentlocation, :description, :facebook, :linkedin, :name, :round, :startupchile, :twitter, :user_id
      has_one :entrepreneus, dependent: :destroy
    
      belongs_to :user
    end
    

    【讨论】:

    • 不是has_many,因为那你仍然不能只做u.startupu.startups,它不会给出Startup对象,而是对象的集合。
    • 感谢您的澄清。
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多