【问题标题】:undefined method 'model_name' for class_name?class_name 的未定义方法“model_name”?
【发布时间】:2012-06-27 01:33:51
【问题描述】:

我正在尝试获取用户工作说明,但不确定我做错了什么。起初,当我只嵌套两者时,我能够获得工作和笔记正常工作,但是当我想获得用户工作笔记时,我的代码就坏了。

notes.controller 新

def new
  @note = @user_note.notes.new
end

private 

def user_note
    @user = current_user
    @job = @user.job.find(params[:job_id])
end

user.rb

has_many :jobs
has_many :notes, through: :jobs

job.rb

belongs_to :user
belongs_to :note

notes.rb

has_many :jobs
has_many :users, through: :jobs

如果我要在 Rails 控制台中键入以下代码,它可以正常工作。

User.last.jobs

如果我尝试在下面编写代码则不会

User.last.jobs.notes

然后我得到错误

undefined method `notes' for #<Job:0x007fe37dc77190>

在为工作创建注释时如何正确获取 user_id?现在它会抓取笔记的作业 ID,但不会抓取用户 ID。我希望能够从工作和用户中找到笔记。任何想法我做错了什么以及如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    基本错误是您通过 2 个 has_many 关系进行询问。这是不可能的。你可以这样做:

    user = User.last
    user.jobs  # returns all the user's jobs
    user.notes # returns all the user's notes
    user.jobs.each_with_object({}) {|job, hash| hash[:job.id] = job.note_ids]} 
      # returns a hash with user's job_id as keys and an array of related note_ids as value
    

    【讨论】:

      【解决方案2】:

      当您使用has_many :through 时,您应该只使用:

      User.last.notes

      这将通过作业获取最后一个用户的笔记

      【讨论】:

        【解决方案3】:

        您的笔记模型看起来有错字,应该是

        has_many :jobs
        

        而不是

        has_jobs
        

        【讨论】:

          猜你喜欢
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多