如何在控制器中查询has_may / belongs_to关联?

时间:2015-08-10 04:31:31

标签: ruby ruby-on-rails-4 rails-activerecord models

我真的很困惑has_many和belongs_to如何在控制器中工作,更具体地说是如何查询数据。

我有一个用户模式和任务模型,用户可以拥有许多任务和任务属于一个特定用户。

以下是我的模特:

class Task < ActiveRecord::Base
  belongs_to :user

  validates :title, 
            presence: true, 
            length: {minimum: 5, maximum: 50}

  validates :description, 
             presence: true, 
             length: {minimum: 1, maximum: 140}
end

class User < ActiveRecord::Base
   has_many :tasks, dependent: :destroy

   has_secure_password

   validates :email, 
             presence: true, 
             uniqueness: true    
 end

因此,在我的Tasks控制器中,我将如何实现相同的操作:

    def index
       # Get all tasks from database
       @tasks = Task.all
       # how would you achieve the same thing, but only show tasks that belong to a specific user? something like this:
       @tasks.users.find(:all)?
   end

我一直在做研究,但我似乎无法掌握这一点。无论如何,任何解释都会有所帮助。谢谢你们。

http://guides.rubyonrails.org/active_record_querying.html

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

2 个答案:

答案 0 :(得分:0)

首先使用find或find_by_id查找用户记录。

user = User.find_by_id(id)

然后调用用户对象上的任务,该任务将列出该特定用户的所有任务。

list_of_tasks = user.tasks

答案 1 :(得分:0)

有关查询has_many关联的正确方法,请参阅Rails&#39;关于热切加载关联的文档(特别是includes方法):

http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

我不确定您希望从数据库表中提取哪些类型的信息,但以下是您可以查询所有任务及其相关用户的几个示例。

@tasks_and_users = Task.all.includes(:user)

@tasks_and_users.each do |task|
  puts "The user with email '#{task.user.email}' has this task: #{task.title}"
end

或者,如果您想要所有用户的列表(无论他们是否有任何任务)及其相关任务,可以选择以下方法:

@users_and_tasks = User.all.includes(:tasks)

@users_and_tasks.each do |user|
  puts "The user with with email '#{user.email}' has the following tasks:"
  user.tasks.each do |task|
    puts "\t Task: #{task.title}"
  end
end