如何使用活动记录正确定义此关联?

纳法阿·布特弗(Nafaa Boutefer)

我在应用程序中有以下两个模型

class City
end

class Suburb
end

一个城市正好有5个郊区,分别是北,东,南,西和中部。我想通过一种对应的方法来引用每个郊区,这样北就可以通过city访问。南北可以通过city.south访问。

我可以为cities表中的每个郊区添加一个外键,并使用belongs_tohas_one定义每个关联。但是我发现它不像它应该的那样直观。这是因为郊区属于城市而不是城市。因此以下定义不直观。

class City
  belongs_to :north, class_name: 'Suburb'
  belongs_to :east, class_name: 'Suburb'
  belongs_to :south, class_name: 'Suburb'
  belongs_to :west, class_name: 'Suburb'
  belongs_to :center, class_name: 'Suburb'
end

class Suburb
  has_one :city
end

这按预期工作。但是当您阅读时,则相反。郊区属于城市,城市具有has_one:north,has_one:east,has_one:south,has_one:west和has_one:center。

我还尝试has_many :suburbscity模型定义一个,并向direction郊区模型添加一个枚举属性,而不是定义一个方法,对每个方向使用define_method',但是我认为它是经过精心设计的。

有没有一种方法可以对此进行正确建模。

阿马科洛德

您的架构本质上没有错,但是为了讨论起见,让我提出一个满足您的建模问题的替代方案:

按照您的提议,我们Suburb属于City为了增强郊区相对于城市的唯一性,我们在表格中添加了一个directionsuburbs,以及结合了city_id的唯一复合索引direction这样一Suburb来,a完全属于一个城市,而一个城市Suburb在给定的范围内不能有多个direction

db / migrate / ... create_suburbs.rb

class CreateDeviseUsers < ActiveRecord::Migration
  def self.change
    create_table(:suburbs) do |t|
      # no need for `index: true` here because of composite key below
      t.references :city, null: false
      t.text :direction, null: false

      t.index [:city_id, :direction], unique: true
    end
  end
end

app / models / city.rb

class City < ActiveRecord::Base
  has_many :suburbs
end

我们的Suburb模型现在稍微复杂一点。我们需要对进行验证direction,并为每个可能的值指定一个范围。我喜欢添加一个确保direction始终也是符号的吸气剂

app / models / suburb.rb

class Suburb < ActiveRecord::Base
  DIRECTIONS = [:north, :east, :south, :west]

  belongs_to :city

  validates :city, presence: true
  validates :direction, inclusion: { in: DIRECTIONS }

  # define a scope for each direction
  DIRECTIONS.each { |d| scope d, -> { where(direction: d) } }

  # convenience getter so that we can reason about direction using symbols
  def direction
    self[:direction].try(:to_sym)
  end
end

现在,我们可以使用范围来访问和深入研究城市郊区:

# all north suburbs
north_suburbs = Suburb.north

# northern suburbs of a city (there can only be one!)
north_suburbs = city.suburbs.north

# as a model
north_suburb = city.suburbs.north.first

如果您真的不喜欢它first,可以定义便捷访问器:

app / models / city.rb

class City < ActiveRecord::Base
  has_many :suburbs

  def north
    suburbs.north.first
  end

  # ...
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用活动记录方法获取关联的关联集合(代理集合)

来自分类Dev

如何仅引用活动记录关联中的持久记录

来自分类Dev

使用活动记录删除

来自分类Dev

如何使用活动菜单项解决此问题

来自分类Dev

如何使用活动记录批量处理each_cons

来自分类Dev

如何使用活动记录来获得朋友的朋友?

来自分类Dev

使用Sitemaps生成器时,是否可以使用活动记录之类的关联?

来自分类Dev

如果当前模型中的方法名称相同,如何调用活动记录的关联方法

来自分类Dev

使用活动记录保存时出错

来自分类Dev

如何使用活动开关创建菜单?

来自分类Dev

如何在没有活动记录模型的情况下使用活动模型序列化器?

来自分类Dev

在Ruby on Rails中使用活动记录执行SQL操作

来自分类Dev

在红宝石宝石中使用活动记录

来自分类Dev

调用活动记录对象时,如何根据某些条件返回不同的活动记录?

来自分类Dev

如何使用活动记录在yii2中的一个交易中进行多个删除或更新或插入

来自分类Dev

如何关联她和活动记录模型?

来自分类Dev

如何在Rails(活动记录)中定义多对多关联和相关属性?

来自分类Dev

如何在SherlockFragment中使用活动代码

来自分类Dev

如何在Android中打开系统数据使用活动?

来自分类Dev

如何使用活动中的列表视图更新App Widget

来自分类Dev

如何设计以不同方式使用活动的流程?

来自分类Dev

如何使用活动框打开“完成动作”

来自分类Dev

单击登录或注册链接时如何使用活动类

来自分类Dev

如何使用活动列绘制以下数据?

来自分类Dev

使用活动记录查询从Postgres DB返回不同或分组的记录

来自分类Dev

如何正确定义变量?

来自分类Dev

如何使用JavaScript正确定义href属性?

来自分类Dev

使用React useContext时如何正确定义类型接口?

来自分类Dev

如何使用requirejs正确定义垫片配置

Related 相关文章

  1. 1

    如何使用活动记录方法获取关联的关联集合(代理集合)

  2. 2

    如何仅引用活动记录关联中的持久记录

  3. 3

    使用活动记录删除

  4. 4

    如何使用活动菜单项解决此问题

  5. 5

    如何使用活动记录批量处理each_cons

  6. 6

    如何使用活动记录来获得朋友的朋友?

  7. 7

    使用Sitemaps生成器时,是否可以使用活动记录之类的关联?

  8. 8

    如果当前模型中的方法名称相同,如何调用活动记录的关联方法

  9. 9

    使用活动记录保存时出错

  10. 10

    如何使用活动开关创建菜单?

  11. 11

    如何在没有活动记录模型的情况下使用活动模型序列化器?

  12. 12

    在Ruby on Rails中使用活动记录执行SQL操作

  13. 13

    在红宝石宝石中使用活动记录

  14. 14

    调用活动记录对象时,如何根据某些条件返回不同的活动记录?

  15. 15

    如何使用活动记录在yii2中的一个交易中进行多个删除或更新或插入

  16. 16

    如何关联她和活动记录模型?

  17. 17

    如何在Rails(活动记录)中定义多对多关联和相关属性?

  18. 18

    如何在SherlockFragment中使用活动代码

  19. 19

    如何在Android中打开系统数据使用活动?

  20. 20

    如何使用活动中的列表视图更新App Widget

  21. 21

    如何设计以不同方式使用活动的流程?

  22. 22

    如何使用活动框打开“完成动作”

  23. 23

    单击登录或注册链接时如何使用活动类

  24. 24

    如何使用活动列绘制以下数据?

  25. 25

    使用活动记录查询从Postgres DB返回不同或分组的记录

  26. 26

    如何正确定义变量?

  27. 27

    如何使用JavaScript正确定义href属性?

  28. 28

    使用React useContext时如何正确定义类型接口?

  29. 29

    如何使用requirejs正确定义垫片配置

热门标签

归档