gpt4 book ai didi

ruby-on-rails - rails 3 : Hash accessor in the model?

转载 作者:行者123 更新时间:2023-12-04 06:04:51 25 4
gpt4 key购买 nike

我正在努力将我对一些基本 Rails 概念的理解扩展到我已经完成的教程示例之外。我找不到任何问答/文档/演练来做我想做的事情,所以我很有可能以错误的方式解决这个问题。

我有一个带有许多标签的 Team 对象。 Team 表有一些规范化的字段,但球队的大部分特征都存储为标签,即 Team 'Virginia Cavaliers' 有标签

{[tag_name => 'Conference', tag_value => 'ACC'],
[tag_name => 'Division', tag_value =>'I']}

等。 db 设计旨在在同一个表中容纳多种类型的团队,标签表有助于通过任意标准搜索团队。

到现在为止还挺好。我无法弄清楚的是如何最好地访问给定团队的团队属性。
class Team < ActiveRecord::Base
belongs_to :sport
has_many :team_subscriptions
has_many :users, :through => :team_subscriptions
has_many :tags
def tagvalue
#Set up a hash to retrieve tag value by name?
@tagvalue = {}
tags.each do |t|
@tagvalue[t.tag_name] = t.tag_value
end
Rails.logger.info(@tagvalues.keys)
end
end

散列在那里,但我无法以我想要的方式访问它。
<%= @team.tagvalue["Conference"] %>

这是明智的吗?可能的?感谢您的回复。

* 根据反馈编辑(这个网站很棒)*

第二个建议在语法上很巧妙,但我可以看到有两个挂断。我必须捕捉空值,因为并非所有团队都有所有标签,有时它们会出现在同一个列表中:

我笨拙的实现:
has_many :tags do 
def [](key)
set = where(:tag_name => key)
if set.length > 0
set.first[:tag_value]
end
nil
end
end

得益于 edgerunner 的干净代码:
has_many :tags do 
def [](key)
where(:tag_name => key).first.try(:tag_value)
end
end

如果我没记错的话,这个方法会在我每次访问标签时进行额外的数据库调用。当对象被实例化时,第一种方法只需要一个。我做对了吗?

最佳答案

可能有不同的方法来做同样的事情。您可以定义匿名关联扩展并定义数组访问器方法以检索带有键的标签。

class Team < ActiveRecord::Base
...
has_many :tags do
def [](key)
where(:tag_name => key).first.try(:tag_value)
end
end
...
end

这将让您仅从数据库中获取所需的标签,而不是一次性获取所有标签以使用其中的一个。它可以让你这样做:
<%= @team.tags["Conference"] %>

关于ruby-on-rails - rails 3 : Hash accessor in the model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com