Rails:从另一个模型调用一个模型。为什么这不可能?

时间:2014-04-28 18:30:49

标签: ruby-on-rails activerecord dry

我有以下型号......

class Room < ActiveRecord::Base
  belongs_to :hotel
  belongs_to :layout
  has_many :visits

  validates :number, presence: true
  validates :rate, presence: true
  validates :smoking, presence: true

  def self.rooms_with_smoking(smoking)
    self.where('smoking = ?', smoking)
  end

  def self.occupied_rooms(from_date, to_date) #24-26
    self.joins(:visits).where('date >= ? and date <= ?', from_date, to_date).uniq
  end

  def self.vacant_rooms(from_date, to_date)
    self.where.not(id: Room.occupied_rooms(from_date, to_date))
  end 

  def self.blahblah(occupancy_count, smoking, from_date, to_date)
    layouts = Layout.layouts_with_occupancy_count_gt(occupancy_count)
    Room.rooms_with_smoking(smoking).vacant_rooms(from_date, to_date).joins(layouts)
  end
end

blahblah方法......

当我尝试从irb运行此命令时,我收到错误...“未知类:布局”

1)房间是否“不知道”布局。我可以不使用这样的其他型号吗?我怎么能这样做。

2)理论问题:有一个大的方法定义来获取某些信息是否更好......或者更好的是有很多小的分区方法,并且在一种方法中使用它们来获得更大的一块数据。例如......

一个'大'方法:

def self.find_rooms_with(occupancy_count, smoking, from_date, to_date)
    Room.vacant_rooms(from_date, to_date).joins(:layout).where('occupancy_count >= ?', occupancy_count).where('smoking = ?', smoking)
end  

绝不大,但所有内容都经过重新编码。似乎不会长时间跟随DRY。

许多小方法:

  def self.blahblah(occupancy_count, smoking, from_date, to_date)
    layouts = Layout.layouts_with_occupancy_count_gt(occupancy_count)
    Room.rooms_with_smoking(smoking).vacant_rooms(from_date, to_date).joins(layouts)
  end

第二个更容易编码。它使用3种内置方法定义。但是,它是否会对第一个产品造成任何性能损失,还是不太理想?

编辑:回答下面的前两条评论......

当我输入Layout或ap Layout时,我得到了我的整个布局模型。

class Layout < ActiveRecord::Base {
                 :id => :integer,
        :description => :string,
    :occupancy_count => :integer,
         :created_at => :datetime,
         :updated_at => :datetime
}
 => nil 

通过irb,是的,我的意思是rails console。这里的完整布局模型......

class Layout < ActiveRecord::Base
    has_many :rooms

    validates :description, presence: true
    validates :occupancy_count, presence: true

    def self.layouts_with_occupancy_count(occupancy_count)
        self.where('occupancy_count = ?', occupancy_count)
    end

    def self.layouts_with_occupancy_count_gt(occupancy_count)
        self.where('occupancy_count >= ?', occupancy_count)
    end
end

1 个答案:

答案 0 :(得分:0)

1)您似乎没有声明Layout类。

belongs_to类方法expects要定义的相应ActiveRecord类。默认情况下,它应与方法名称匹配(:layout对应于Layout)。