Rails 3错误:对象不支持包含的#inspect(左外连接)

时间:2011-04-28 05:06:08

标签: ruby-on-rails

我正在使用Rails 3。

我有3个型号:

class Deal < ActiveRecord::Base
  has_many :wishes, :class_name => "Wish"
  has_many :wishers, :through => :wishes, :source => :user
end

class User < ActiveRecord::Base
  has_many :wishes, :class_name => "Wish", :conditions => { 'wishes.wished' => true }
  has_many :wished_deals, :through => :wishes, :source => :deal
end

class Wish < ActiveRecord::Base
  belongs_to :user
  belongs_to :deal
end

我正在尝试在交易模型中创建以下范围:

scope :not_wished_by_user, lambda { |user| includes(:wishes).where('wishes.wished' != true, 'wishes.user_id' => user) }

我想要的是所有交易,除了那些被块中给定用户标记为“希望”的交易。但每当我这样做包括,我得到以下错误:

ruby-1.9.2-head > u = User.all.first
ruby-1.9.2-head > Deal.not_wished_by_user(u)
(Object doesn't support #inspect)
 =>  

此外,将其置于功能中也不起作用。知道这可能是什么吗?

谢谢!

编辑:这些是愿望表迁移

class CreateWish < ActiveRecord::Migration
  def self.up
    create_table :wishes do |t|
      t.integer :deal_id
      t.integer :user_id
      t.boolean :wished, :default => true
      t.boolean :collected, :default => false
      t.datetime :collected_date
      t.timestamps
    end

    add_index :wishes, [:deal_id, :user_id], :uniq => true
  end
end

1 个答案:

答案 0 :(得分:1)

请参阅下面的更新vv

旧答案

您没有对选择使用任何Deal属性,因此请尝试将代码移至Wish类:

class Wish < ActiveRecord::Base
  belongs_to :user
  belongs_to :deal

  scope :'wished?', lambda{ |f| where('wished = ?', f) }

  scope :not_wished_by_user, lambda{|user| wished?(false).where('user_id = ?', user)}
end

用法例子和输出:

ruby-1.9.2-p180 :023 > Wish.not_wished_by_user(User.first).to_sql
  => "SELECT \"wishes\".* FROM \"wishes\" WHERE (wished = 't') AND (user_id = 1)"

这对你来说是正确的结果吗?

PS:

Deal中,您可以保留代理方法,例如:

class Deal < ActiveRecord::Base
  has_many :wishes, :class_name => "Wish"
  has_many :wishers, :through => :wishes, :source => :user

  def self.not_wished_by_user(user)
    Wish.not_wished_by_user(user)
  end
end

Update1(子查询)

class Deal < ActiveRecord::Base
  has_many :wishes, :class_name => "Wish"
  has_many :wishers, :through => :wishes, :source => :user

  scope :deal_ids_not_wished_by_user, lambda { |user|
    joins(:wishes).where('wishes.user_id = ?', user).where('wishes.wished = ?', false).select('deals.id')
  }

  scope :wished_by_user, lambda { |user|
    where("id not in (#{Deal.deal_ids_not_wished_by_user(user).to_sql})")
  }
end

用法示例和输出:

ruby-1.9.2-p180 :023 > Deal.wished_by_user(User.first).to_sql
  => "SELECT \"deals\".* FROM \"deals\" WHERE (id not in (SELECT deals.id FROM \"deals\" INNER JOIN \"wishes\" ON \"wishes\".\"deal_id\" = \"deals\".\"id\" WHERE (wishes.user_id = 1) AND (wishes.wished = 'f')))"

UPD2(铁路外部联接)

交易类:

class Deal < ActiveRecord::Base
  has_many :wishes, :class_name => "Wish"
  has_many :wishers, :through => :wishes, :source => :user

  scope :not_wished_excluded, lambda { |user|
    joins('LEFT OUTER JOIN wishes on wishes.deal_id = deals.id').
      where('wishes.user_id = ? OR wishes.user_id is null', user).
      where('wishes.wished = ? OR wishes.wished is null', true)
  }
end

用法:

ruby-1.9.2-p180 :096 > Deal.not_wished_excluded(User.first).to_sql
 => "SELECT \"deals\".* FROM \"deals\" LEFT OUTER JOIN wishes on wishes.deal_id = deals.id WHERE (wishes.user_id = 1 OR wishes.user_id is null) AND (wishes.wished = 't' OR wishes.wished is null)"