0

情况:

我有 4 个具有以下关系的模型:

class A < ActiveRecord::Base
  belongs_to :b
  belongs_to :c
  belongs_to :d
end

class B < ActiveRecord::Base
  has_many :as, dependent: :destroy
end

class C < ActiveRecord::Base
  belongs_to :d
end

class D < ActiveRecord::Base
  has_many :cs, dependent: :destroy
end

问题:

我需要将模型 A 对象a与模型 B 对象相关联,b但我还需要为调用时a出现在ActiveRecord CollectionProxyb.as中的对象设置一个位置,它不起作用。所有将对象添加到结果中的某个位置的尝试最终都会在aa.bsa最后添加新对象。有可能吗?我知道有可能在数组中和查询时定义排序,但是在添加新关系时是否可以直接定义排序?

例子:

模型 B 对象b有 3 个模型 A 对象。

b.as
  => #<ActiveRecord::Associations::CollectionProxy [
    #<A id: 39038, quantity: 3.0 created_at: "2016-02-01 15:51:26", updated_at: "2016-02-01 15:51:26", d_id: 4144, c_id: nil, b_id: 81218>, 
    #<A id: 39039, quantity: 2.0, created_at: "2016-02-01 15:51:26", updated_at: "2016-02-01 15:51:26", d_id: 4145, c_id: nil, b_id: 81218>,
    #<A id: 39040, quantity: 2.0, created_at: "2016-02-01 15:51:26", updated_at: "2016-02-01 15:51:26", d_id: 4145, c_id: 1590, b_id: 81218>]>

我创建了第四个模型 A 对象a,当这样调用时,我需要它出现在第二位b.as

a = A.create(quantity: 4.0, d: D.find(4144), c: C.find(1612), b: b)

基本上顺序应该这样定义:

b.as
=>
  a1: d_id: 4144, c_id: nil
  a2: d_id: 4144, c_id: 1612
  a3: d_id: 4145, c_id: nil
  a4: d_id: 4145, c_id: 1590

...意味着a具有相同d_id属性的每个对象都应该组合在一起,同时拥有那些ac_id.nil?首位的对象。

4

2 回答 2

1

add 方法将始终将其添加到列表的末尾。您需要某种位置属性来实现您想要的。如果您不想自己实现,可以查看Acts as list gem。另一种选择是default_scope { order: :key_to_order_by }在 As 模型上添加一个。

于 2016-02-01T18:01:19.483 回答
1
has_many :as, -> { order(d_id: :asc, c_id: :asc) }

应该是接近的,除了 nil 在最高之后的最后排序cd_id。那是postgres做的那种,所以我不知道你是否可以在那里做很多事情。

于 2016-02-01T18:21:26.027 回答