Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 4中选择正确的模型关联_Ruby On Rails_Ruby On Rails 4_Model_Rails Activerecord_Model Associations - Fatal编程技术网

Ruby on rails 在Rails 4中选择正确的模型关联

Ruby on rails 在Rails 4中选择正确的模型关联,ruby-on-rails,ruby-on-rails-4,model,rails-activerecord,model-associations,Ruby On Rails,Ruby On Rails 4,Model,Rails Activerecord,Model Associations,我很难决定哪种类型的关联最适合我的申请。我有以下几种型号:公司,客户,和案例 公司处理许多案件。每个案例都可以分配一个或多个客户机。因此,我最初的做法是: class Firm < ActiveRecord::Base has_many :cases has_many :clients end class Case < ActiveRecord::Base belongs_to :firm has_many :clients end class Clien

我很难决定哪种类型的关联最适合我的申请。我有以下几种型号:
公司
客户
,和
案例

公司处理许多案件。每个案例都可以分配一个或多个客户机。因此,我最初的做法是:

class Firm < ActiveRecord::Base
   has_many :cases
   has_many :clients
end

class Case < ActiveRecord::Base
   belongs_to :firm
   has_many :clients
end

class Client < ActiveRecord::Base
   belongs_to :firm
   has_many :cases
end
class公司

但我认为这有点不对。我在想一个
有很多:通过
关联会更好,但我不确定。

假设一个案例永远不会属于另一家公司:

class Firm < ActiveRecord::Base
    has_many :clients
    has_many :cases, through: :clients
end

class Client < ActiveRecord::Base
    belongs_to :firm
    has_and_belongs_to_many :cases
end

class Case < ActiveRecord::Base
    has_and_belongs_to_many :clients
end
class公司
迁移联接表
rails g migration CreateJoinTableCaseClient案例客户

假设一个案例永远不会属于另一家公司:

class Firm < ActiveRecord::Base
    has_many :clients
    has_many :cases, through: :clients
end

class Client < ActiveRecord::Base
    belongs_to :firm
    has_and_belongs_to_many :cases
end

class Case < ActiveRecord::Base
    has_and_belongs_to_many :clients
end
class公司
迁移联接表
rails g迁移CreateJoinTableCaseClient案例客户端

Rails指南说,“如果需要验证、回调或连接模型上的额外属性,则应该使用has_many:town”。正如伟大的编码哲学家Avi Flombaum曾经回避的那样,您怎么可能知道您的连接模型在应用程序过程的早期不会起到额外的作用呢。无论您处于开发阶段的何处,您永远都无法看到未来如此之远,从而知道您将不需要扩展联接表

这样一来:

# models/firm.rb
class Firm < ActiveRecord::Base
    has_many :clients
    has_many :cases, through: :clients
end

# models/client.rb
class Client < ActiveRecord::Base
    belongs_to :firm
    has_many :client_cases
    has_many :cases, through: :client_cases
end

# models/case.rb
class Case < ActiveRecord::Base
    has_many :client_cases
    has_many :clients, through: :client_cases
end

# models/client_case.rb
class ClientCase < ActiveRecord::Base
    belongs_to :client
    belongs_to :case
end
Rails指南说,“如果需要验证、回调或连接模型上的额外属性,则应该使用has_many:town”。正如伟大的编码哲学家Avi Flombaum曾经回避的那样,您怎么可能知道您的连接模型在应用程序过程的早期不会起到额外的作用呢。无论您处于开发阶段的何处,您永远都无法看到未来如此之远,从而知道您将不需要扩展联接表

这样一来:

# models/firm.rb
class Firm < ActiveRecord::Base
    has_many :clients
    has_many :cases, through: :clients
end

# models/client.rb
class Client < ActiveRecord::Base
    belongs_to :firm
    has_many :client_cases
    has_many :cases, through: :client_cases
end

# models/case.rb
class Case < ActiveRecord::Base
    has_many :client_cases
    has_many :clients, through: :client_cases
end

# models/client_case.rb
class ClientCase < ActiveRecord::Base
    belongs_to :client
    belongs_to :case
end


因为一个案例可以有很多客户,而一个客户可以有很多案例,所以需要一个has_many_-through关联。一家公司可以有一个不属于客户的案例吗?不。一个案例必须总是涉及一个客户。@Jaime在客户模型中,你必须存储案例id和公司id。我说的对吗?@margo如果公司可以有没有案例的客户,那么
有很多:通过
是不够的,是吗@詹姆:一个没有案例的客户能存在吗?应该存在。客户案例关系不必是强制性的。只需确保您定义了through表并创建了迁移。因为一个案例可以有多个客户端,而一个客户端可以有多个案例,所以需要一个has_many_through关联。一家公司可以有一个不属于客户的案例吗?不。一个案例必须总是涉及一个客户。@Jaime在客户模型中,你必须存储案例id和公司id。我说的对吗?@margo如果公司可以有没有案例的客户,那么
有很多:通过
是不够的,是吗@詹姆:一个没有案例的客户能存在吗?应该存在。客户案例关系不必是强制性的。只需确保您定义了贯穿表并创建了迁移。这看起来不错,但如果有一种情况,案例可能存在,而没有与之关联的客户,那么我也会在公司和案例之间添加一个直接关联。无论如何,我都很想这样做,因为我觉得应该有一种方法来做(例如)first.cases,而不需要打电话给uniq查询结果。谢谢你的回答,但是我有点困惑为什么需要一个Case和ClientCase模型?这本质上是写一个
has\u和\u属于\u many
协会。
ClientCase
模型充当您的连接表,就像HABTM一样,允许您对如何使用连接模型进行更多控制。我建议你仔细阅读我在回复中发布的内容。谢谢。但是有一个问题:如果我想访问一家公司的所有CASO,该怎么办?可能执行计数、执行每个等。我如何才能在视图中实现这一点?因为
公司
有许多:案例,通过::clients
您可以简单地调用
@Firm.cases.uniq.count
这似乎很好,但是如果有一种情况,一个案例不需要与之关联的客户就可以存在,然后我还要加上公司和案例之间的直接联系。无论如何,我都很想这样做,因为我觉得应该有一种方法来做(例如)first.cases,而不需要打电话给uniq查询结果。谢谢你的回答,但是我有点困惑为什么需要一个Case和ClientCase模型?这本质上是写一个
has\u和\u属于\u many
协会。
ClientCase
模型充当您的连接表,就像HABTM一样,允许您对如何使用连接模型进行更多控制。我建议你仔细阅读我在回复中发布的内容。谢谢。但是有一个问题:如果我想访问一家公司的所有CASO,该怎么办?可能执行计数、执行每个等。我如何才能在视图中实现这一点?因为
公司
有许多:案例,通过::客户
您可以简单地调用
@Firm.cases.uniq.count