1

每个帖子只有一个类别,我需要通过类似的方式访问类别的名称

p = Post.new
p.category.name = "tech"
p.save

怎么做?


   class Category < ActiveRecord::Base
       has_many :posts, :dependent => :destroy

       attr_accessible :name, :image

    end

Post.rb

class Post < ActiveRecord::Base
    belongs_to :category

    attr_accessible :category_id, :name, :text, :lang, :image

end

架构.rb

create_table "categories", :force => true do |t|
    t.string "name"
    t.string "image"
  end
4

2 回答 2

4

您的示例包含一个问题。

p = Post.new
p.category.name = "tech"
p.save

首先,您创建一个新帖子。其次,您想为帖子的类别分配名称,但没有分配类别。这会导致调用类似于post.nil.namewherenil将是类别对象(如果已分配),但事实并非如此。由于nil没有方法name,您会得到描述的错误undefined method name for nil class

要解决这个问题,您首先需要分配一个类别来处理。

p.category = Category.firstp.category_id = 1。之后,p.category将返回类别对象,因此p.category.name是有效的,因为它是在类别对象上而不是在 上调用的nil

tl;博士:

p = Post.new
p.category # => nil
p.category.name # throws an error

p.category = Category.first
p.category # => <#Category ...>
p.category.name # => 'actual name of category'
p.category.name = 'foo' # works now
于 2012-05-11T21:24:59.530 回答
1

问题是如果类别记录不存在,您需要/想要显式构建它。

为了解决这个问题,我会考虑category_name=在 Post 中创建一个方法:

category_name=设定者还将处理“得墨忒耳法则”问题

class Post < ActiveRecord::Base
  belongs_to :category

  attr_accessible :category_id, :name, :text, :lang, :image

  attr_accessible :category_name=, :category_name

  def category_name=(name)
    self.category = Category.find_or_create_by_name(name)
  end

  def category_name
    category && category.name
  end

结尾

另请参阅ActiveRecord文档中的“关联扩展”以了解另一种方法。

于 2012-05-11T21:27:28.410 回答