首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails嵌套资源创建

Rails嵌套资源创建
EN

Stack Overflow用户
提问于 2016-01-02 21:39:03
回答 3查看 73关注 0票数 1

在RoR中,每当您创建嵌套资源时,在创建具有父关联的资源时,是否需要在模型中设置属性?

我有一个角色模型,可以是belong_to和have_many其他角色。

代码语言:javascript
复制
employee = Role.find_by_slug :employee
employee.role
=> nil
employee.roles
=> [...more roles...]
waitress = employee.roles.create(slug: :waitress)
=> #<Role id...
waitress.role
=> #<Role slug: 'employee'...
waitress.roles
=> []

角色模型具有子类型的布尔属性。每当我从现有角色创建角色时,我都希望将子类型设置为true。

代码语言:javascript
复制
employee.subtype
=> false

女服务员的样子是这样的:

代码语言:javascript
复制
waitress.subtype
=> true
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-03 11:07:11

每当我从现有角色创建角色时,我都希望将子类型设置为true。

代码语言:javascript
复制
#app/models/Role.rb
class Role < ActiveRecord::Base
   belongs_to :role
   has_many   :roles

   validate :role_exists, if: "role_id.present?"
   before_create :set_subtype, if: "role_id.present?"

   private

   def set_subtype
     self.subtype = true
   end

   def role_exists
      errors.add(:role_id, "Invalid") unless Role.exists? role_id
   end
end

上面的请求将需要另一个db请求;它只用于create &它将在调用模型时发生(在需要时,您可以任意调用它)。

--

另一种替代方法是使用acts_as_tree或类似的层次结构gem。

AAT在数据库中添加了一个parent_id列,然后它将向其中附加一系列可以调用的实例方法(parentchild等)。

这将允许您摆脱has_many :roles,并将其替换为children实例方法:

代码语言:javascript
复制
#app/models/role.rb
class Role < ActiveRecord::Base
   acts_as_tree order: "slug"
   #no need to have "subtype" column or has_many :roles etc
end

root      = Role.create            slug: "employee"
child1    = root.children.create   slug: "waitress"
subchild1 = child1.children.create slug: "VIP_only"

root.parent   # => nil
child1.parent # => root
root.children # => [child1]
root.children.first.children.first # => subchild1
票数 1
EN

Stack Overflow用户

发布于 2016-01-02 22:27:27

根据您的描述,如果给定的Role没有父角色,它将被视为子类型。在本例中,只需向Role添加以下方法

代码语言:javascript
复制
def subtype?
  !self.role.nil?
end
票数 0
EN

Stack Overflow用户

发布于 2016-01-02 22:41:03

以下的变化对我来说是个诀窍:

发自:

代码语言:javascript
复制
has_many :roles

至:

代码语言:javascript
复制
has_many :roles do
  def create(*args, &block)
    args[0][:subtype] = true
    super(*args, &block)
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34570997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档