0

红宝石新手在这里。首先,这比实际更哲学,所以如果有更好的方法来实现这一点,请告诉。

我有一张大致如下所示的表格:

╔════╦════════╦════════╦══════════╗
║ ID ║ label  ║ value  ║ thing_id ║
╠════╬════════╬════════╬══════════╣
║  1 ║ color  ║ red    ║        1 ║
║  2 ║ size   ║ medium ║        1 ║
║  3 ║ weight ║ heavy  ║        1 ║
╚════╩════════╩════════╩══════════╝

我对此进行查询并获取特定事物的记录集。

thing_attributes = ThingAttributes.where(:thing_id => 1)

这会导致该表中包含 5 行左右的记录集。我希望能够创建一个允许我创建等效于{"color" => "red", "size" => "medium", "weight" => "heavy" }. 想法?

4

3 回答 3

2

好的,基本上您正在尝试模仿无模式数据库,因为您希望不同的记录具有不同的属性。只要您只有一个自定义属性 pr。记录,这可能有效,但是如果您的记录的差异属性多于常见属性,那么您可能需要考虑拥有多个模型,查看 hstore 数据类型或查看文档数据库,例如 MongoDB。

更新

再次阅读您的问题,我想我有一个更好的解决方案,所以我删除了原来的问题。

我将把你的 ThingAttributes 类称为我认为的 - CustomAttribute 类。因为每条记录代表一个自定义属性。一个事物可以有许多(在您的示例中为五个)自定义属性。

所以你可以这样做:

class CustomAttribute < ActiveRecord::Base
  belongs_to :thing
  attr_accessible :name, :value
end

class Thing < ActiveRecord::Base
  has_many :custom_attributes
end

现在你可以找到一个东西,通过写

my_thing = Thing.find(3)

然后,您可以通过编写找到它的 custom_attributes

my_thing.custom_attributes

这将返回一组自定义属性。但是,您(出于某种原因)要求哈希。这也可以做到。在您的 Thing 类中,定义此方法:

def custom_attributes_hash
  custom_hash = {}
  self.custom_attributes.each do |attr|
    custom_hash[attr.name] = attr.value
  end
  custom_hash
end

现在,您可能还希望能够以方便的方式设置属性。在你的 Thing 类上定义它。

def set_custom_attribute(name, value)
  return unless name.present? # Short circuits method if an empty string or nil is being used as name.
  custom_attribute = self.custom_attributes.find_by_name(name) # Attemps to find custom attribute with the name
  if custom_attribute.nil? # Executes block if no attribute was found
    return unless value.present? # Short circuits method if nil or empty string was passed as value
    self.custom_attributes.create(name: name, value: value) # Creates and saves new custom attribute
  else
    if value.present? # Updates existing attribute if passed is not an empty string or nil.
      custom_attribute.update_attribute(:value, value)
    else
      custom_attribute.destroy # Deletes custom attribute from DB if set_custom_attribute was called with a nil or empty value.
    end
  end
end
于 2013-05-10T20:05:03.423 回答
0

我不确定我是否会好起来,但试试这个:

my_thing = Thing.find(1)
my_thing.color
于 2013-05-10T19:55:04.530 回答
0

我认为这就是您所要求的:

Thing_model.rb

thing = Thing.find(1)

 def #{self.label}
    return self.value
于 2013-05-10T20:00:44.783 回答