了解rails 3中的关联

时间:2013-02-01 19:42:24

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

似乎我需要了解我在rails中的关联。目前我正在尝试显示所有以部门名称为员工的帖子。

目前存在两种模式,帖子和部门

class Post < ActiveRecord::Base
  belongs_to :department
  attr_accessible :title, :comments, :department_id
end

class Department < ActiveRecord::Base
  has_many :posts
  attr_accessible :name, :post_id
  #Scopes
  scope :staff_posts, where(:name => "Staff") 
end

所以我想显示所有具有部门名称职员的帖子

这样做我把它放在我的控制器中

class PublicPagesController < ApplicationController

  def staffnews
    @staffpost = Department.staff_posts
  end

end

在我看来,我试图像这样显示所有这些帖子

<% @staffpost.each do |t| %>
  <h2><%= t.title %>
  <h2><%= t.comments %></h2>
<% end %>

显然在某个地方出错了,因为我得到了未定义的方法nil,即使我有3个帖子的名字'Staff'

有人可以解释我在哪里误解了协会,因为我很想做到这一点

修改

路线

scope :controller => :public_pages do 
get "our_news"

match "our_news/staffnews" => "public_pages#staffnews"

3 个答案:

答案 0 :(得分:4)

在控制器中,它返回名称为staff的部门。并且您在部门对象上使用标题和注释,这就是为什么它给出了nil方法错误。

像这样使用:

 def staffnews
   @dept_staff = Department.staff_posts
 end

 <% @dept_staff.each do |ds| %>
   <% ds.posts.each do |p| %>
     <h2><%= p.title %></h2>
     <h2><%= p.comments %></h2>
   <% end %>
 <% end %>

在帖子模型中创建named_scope

class Post < ActiveRecord::Base
  belongs_to :department
  attr_accessible :title, :comments, :department_id
  scope :staff_posts, :include => :department, :conditions => {"departments.name" => "Staff"}
end


class Department < ActiveRecord::Base
  has_many :posts
  attr_accessible :name, :post_id
end

控制器:

def staffnews
  @staffpost = Post.staff_posts
end

查看:#No change

<% @staffpost.each do |t| %>
  <h2><%= t.title %></h2>
  <h2><%= t.comments %></h2>
<% end %>

答案 1 :(得分:0)

您的staff_posts范围仅选择名为“Staff”的部门。假设您将只有一个名为staff的部门,那么您有几种方法可以解决这个问题。

这将找到所有名称为staff的部门,并急切加载随之而来的帖子:

@department = Department.where(name: "Staff").include(:posts).first

但是,由于您尝试使用Post作为范围,因此它属于Post。以下是使用方法作为范围的示例:

class Post < ActiveRecord::Base
  belongs_to :department
  attr_accessible :title, :comments, :department_id

  def self.staff
    where(department_id: staff_department_id)
  end

  def staff_department_id
    Department.find_by_name!("Staff").id
  end

end

这样,您可以使用@staff_posts = Post.staff并迭代该集合(注意:我不建议永久地以这种方式获取staff_department_id。这可以在应用程序启动时设置为常量,或其他一些更强大的解决方案)。

答案 2 :(得分:0)

您可以通过以下更改找到具有部门名称职员的所有帖子:

class PublicPagesController&lt; ApplicationController中

def staffnews
    #get all the department which have name is staff
    departments = Department.where("name=?","staff")

    #get all the ids
    department_ids = departments.map(&:id)

    #retrieve post that department name is staff 
    @staffpost = Post.find_by_department_id(department_ids)
end