1

我有三个模型UserProductTransaction。(Transactionbelongs_to both, and have Usermany Productand have Productmany User, through Transaction

在我的Transaction模型中,我有一个current交易范围:

scope :current, -> { where 'transactions.start_date IS NOT NULL AND transactions.end_date IS NULL' }

我希望能够在控制台中执行此操作,以检索所有具有current交易的产品:

User.first.products.owned

在控制台中,我可以通过以下方式实现:

User.first.products.merge(Transaction.current.ownership)

第一次尝试

所以我在我的Product模型中添加了这个:

def self.owned
  merge(Transaction.current.ownership)
end

我在控制台中输入:

User.first.products.owned

但这里什么是 rails 控制台告诉我:

NoMethodError: undefined method `merge' for #<Class:0x00000004e2c0f8>
    from /home/flo/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.0.rc1/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

其他尝试

如果我在我的Product模型中添加这个:

def self.owned
  joins(:transactions).merge(Transaction.current.ownership)
end

我在控制台中输入:

User.first.products.owned

但它检索所有具有当前交易的产品,而不仅仅是第一个用户的具有当前交易的产品。

你知道我做错了什么吗?

4

2 回答 2

2
  1. 第一次尝试:您正在调用mergeaProductmerge我认为需要明确调用 an AR::Relationdistinct wherejoins等等。

  2. 第二次尝试joins搞乱了用户范围。

我建议您使用方法scoped(for rails < 4) 或all(for rails >= 4) 将代理该方法运行所需的 AR::Relation merge

def self.owned
  scoped.merge(Transaction.current.ownership)
end
于 2013-07-22T19:28:36.877 回答
1

当然,您只是没有订购或限制您的产品。

scope :current, where('transactions.start_date IS NOT NULL AND transactions.end_date IS NULL').order("by whatever").limit(1)

您可能需要订购正确的产品,否则您可以删除订购方法。

于 2013-07-21T16:05:05.763 回答