标签: virtual-attribute

在rails中,默认的getter和setter会是什么样子?

我知道我可以编写attr_accessor:tag_list来为Rails中的对象创建一个虚拟属性tag_list.这允许在对象的表单中存在tag_list属性.

如果我使用attr_accessor:tag_list,我可以在模型中对tag_list执行操作以从表单中提取和操作数据.

我想知道的是,而不是写attr_accessor,我怎么会写一个getter和setter,将完全复制的attr_accessor默认功能.例如:

def tag_list
    #what goes here
end
Run Code Online (Sandbox Code Playgroud)

仅供参考我尝试过

 def tag_list
     @tag_list
 end
Run Code Online (Sandbox Code Playgroud)

这不起作用.

ruby ruby-on-rails virtual-attribute attr-accessor ruby-on-rails-3

24
推荐指数
2
解决办法
3万
查看次数

Rails虚拟属性搜索或sql组合列搜索

我有一个属性'first'和'last'的用户模型所以例如User.first.first#=>"Charlie"User.first.last#=>"Brown"

此用户模型还具有虚拟属性"full_name"

#user.rb
def full_name
  [first,last].join(' ')
end

def full_name=(name) #don't know what to do with people w/ middle names
  split = name.split(' ')
  self.first = split[0]
  self.last = split[1]
end
Run Code Online (Sandbox Code Playgroud)

例如:

User.first.full_name = "Charlie Brown" #=> "Charlie Brown"
User.first.full_name = "Homer Simpson" #=> "Home Simpson"
User.first.save
User.first.first #=> "Homer"
User.first.last #=> "Simpson"
Run Code Online (Sandbox Code Playgroud)

如果我可以通过该虚拟属性进行搜索,例如动态查找,那就太好了:

User.find_by_full_name('Home Simpson') # this doesn't work
Run Code Online (Sandbox Code Playgroud)

查找条件的示例:

User.all(:conditions => ['full_name LIKE ?', query]) #this doesn't work
Run Code Online (Sandbox Code Playgroud)

我希望在SQL语言中至少找到一些可以做到这一点的方法; 如果还有一个动态虚拟属性查找,那就是在结构上的额外香草源.(今年冬天有这个人吗?)

我还担心被搜索的名称,例如,"Holmes"可能只能在"第一"列中搜索,而不能搜索到"最后"列,例如User.first.full_name #=> "Sherlock Holmes".

我确实尝试过更全面的搜索:

user.rb …

sql ruby-on-rails find virtual-attribute conditional-statements

11
推荐指数
1
解决办法
3412
查看次数

Rails 3:使用:if语句创建验证

您好我正在尝试设置仅在特定表单视图中调用的验证,为此我尝试在表单上为虚拟属性创建hidden_​​field并将其设置为值,然后验证:如果虚拟属性等于该值.

到目前为止,我有:

## user model 

validates_presence_of :password_confirmation, :if => :confirmation_validation 

attr_accessible :email, :password, :password_confirmation, 
 :remember_me, :name, :avatar, :username, :bio, :confirmation_validation

def confirmation_validation
 # not sure what goes here???
end


## form view


<%= form_for(resource, :validate => true, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }, :html => {:multipart => true}) do |f| %>
<%= devise_error_messages! %>

<p><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password %></p>

<p><%= …
Run Code Online (Sandbox Code Playgroud)

validation ruby-on-rails virtual-attribute ruby-on-rails-3

10
推荐指数
2
解决办法
1万
查看次数

rails 4中的虚拟属性

我如何在rails 4中使用虚拟属性(getter,setter),因为'attr_accessible'已被删除.

我在这里遇到问题

  def tags_list
    @tags = self.tags.collect(&:name).join(', ')
  end
Run Code Online (Sandbox Code Playgroud)

在尝试更新/创建时,我可以达到上述方法,但无法达到下面的setter.

  def tags_list=(tags)
    @tags = tags
  end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails virtual-attribute attr-accessor ruby-on-rails-4

10
推荐指数
1
解决办法
2万
查看次数

在Yii框架中,如何组合列并在下拉列表中显示为显示字符串

我有一个dropDownList在我看来,它是由填充clients表,表中包含样柱first_name,last_name,id等等,现在我想展示first_namelast_name作为显示文本和id在下拉列表中的值,我有做id的价值和first_name作为显示文本,但在这里我想组合这些列(first_namelast_name)并用作显示文本.

在模型中

function getClients()
{
    $Clients = Client::model()->findAll();
    $list    = CHtml::listData($Clients , 'client_id', 'first_name');
    return $list;
}
Run Code Online (Sandbox Code Playgroud)

在视野中

echo $form->dropDownList($model,'client_id',$model->getClients());
Run Code Online (Sandbox Code Playgroud)

php yii virtual-attribute html.dropdownlistfor yii-cmodel

9
推荐指数
2
解决办法
1万
查看次数

虚拟属性未移动到params内的模型哈希

我在我的Rails 3.2应用程序中遇到问题,其中通过JSON重新发送的虚拟属性不在params散列中的正确位置.嗯,这不是我所期待的.我的期望是否正确还有待观察.:)

我有一个使用标准虚拟属性模式的模型,如下所示:

class Track < ActiveRecord::Base
  def rating
    # get logic removed for brevity
  end

  def rating=(value)
    # set logic
  end

  def as_json(options={}) # so my method is in the JSON when I use respond_with/to_json
    super(options.merge(methods: [:rating]))
  end
end
Run Code Online (Sandbox Code Playgroud)

发送到我的控制器的JSON如下所示:

{"id":1,"name":"Icarus - Main Theme 2","rating":2}
Run Code Online (Sandbox Code Playgroud)

要清楚,名称和ID不是虚拟的,评级是.

在rails实现其魔力之后,我最终在params哈希中得到了这个:

{"id"=>"1", "name"=>"Icarus - Main Theme 2", "rating"=>2, "track"=>{"id"=>"1", "name"=>"Icarus - Main Theme 2"}}
Run Code Online (Sandbox Code Playgroud)

如您所见,id和name使其成为嵌套的:track散列,但是rating不是.这是预期的行为吗?它打破了(在某种程度上)在控制器中使用嵌套哈希的标准做法,因为嵌套哈希不包含我需要的所有参数.

Track.update(params[:id], params[:track]) # :track is missing rating
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

virtual-attribute ruby-on-rails-3

6
推荐指数
1
解决办法
887
查看次数

在Rails模型中设置和获取虚拟属性

我正在寻找一种方法来解决以下问题:

Event模型datetime中的两个属性:

start_at: datetime
end_at:   datetime
Run Code Online (Sandbox Code Playgroud)

我想使用3个字段以表格形式访问它们:

event_date
start_time
end_time
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是如何将实际虚拟属性保持在"同步",以便可以通过表单和/或直接通过start_at&更新模型end_at.

class Event < ActiveRecord::Base
  attr_accessible :end_at, :start_at, :start_time, :end_time, :event_date
    attr_accessor :start_time, :end_time, :event_date

  after_initialize  :get_datetimes # convert db format into accessors
  before_validation :set_datetimes # convert accessors into db format

  def get_datetimes
    if start_at && end_at
      self.event_date ||= start_at.to_date.to_s(:db)   # yyyy-mm-dd 
      self.start_time ||= "#{'%02d' % start_at.hour}:#{'%02d' % start_at.min}" 
      self.end_time   ||= "#{'%02d' % end_at.hour}:#{'%02d' % end_at.min}" 
    end
  end

  def set_datetimes
    self.start_at …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails accessor virtual-attribute ruby-on-rails-3

6
推荐指数
2
解决办法
1万
查看次数

rails 3基于多个字段查找或创建

我正在尝试使用notes对象上的标记虚拟属性来实现一个简单的标记系统.标签包含标签和user_id.我想要做的是根据标签字段中的内容将HABTM更新为与笔记的关系.我知道find_or_create_by_X方法,我可以用2个字段做类似的事情,即如果标签&user_id是唯一的,则创建一个新标签,否则获得标签和用户ID匹配的标签.还有一种类似的处理标签删除的方法吗?

ruby-on-rails virtual-attribute

5
推荐指数
1
解决办法
3777
查看次数

何时使用虚拟属性或在Rails 3中的散列中传递数据

在我的应用程序中,我有一个Widget模型,一个Feature带有has_many的模型,通过WidgetFeature表关联.

根据要求,当我发送WidgetFeature对象时,我也应该将feature_name附加到它,用于相关的给定功能.
有两种方法:

  1. 发送对象时,请执行以下操作:
widget_feature_object[:feature_name] = feature_name_value
Run Code Online (Sandbox Code Playgroud)

然后我可以在我的控制器或视图中访问它,widget_feature_object[:feature_name]因为一个对象有(键,值)对,所以我也可以添加另一个.

2.制作feature_name一个虚拟属性WidgetFeature模型,然后创建getter和setter方法吧.

据我所知,当您想要创建与模型中实际存在的字段不同的不同视图时,您应该使用虚拟属性(例如,全名=名字+姓氏).
同样的事情也适合这里吗?

另外,Rails是否对对象进行了一些缓存,在使用虚拟属性时可能会有用,而不是在我使用第一种方法时?

每种方法的优缺点是什么,哪种方法最符合我的要求?非常感谢.

caching ruby-on-rails virtual-attribute ruby-on-rails-3 memorycache

4
推荐指数
1
解决办法
591
查看次数

Yii2 添加相关属性进行排序

我有带有 ActiveDataProvider 的普通 ModelSearch,我想在 gridview 中添加一个虚拟/相关属性来排序。如果我正在使用 setSort,并且我只添加了这个属性,那么所有其他属性都不再可排序。是否有内置的方法可以向 Sort添加属性?非常感谢!

public function search($params) {
    $query = Za::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => ['defaultOrder' => ['aonr' => SORT_ASC]],
        'pagination' => [
            'pageSize' => 15,
        ],
    ]);

$dataProvider->setSort([
    'attributes' => [
        'lwnr' => [
            'asc' => ['lwnr' => SORT_ASC],
            'desc' => ['lwnr' => SORT_DESC],
            'label' => 'lwnr',
            'default' => SORT_DESC,
        ],
    ]
]);

$this->load($params);
...
}
Run Code Online (Sandbox Code Playgroud)

sorting gridview virtual-attribute yii2

4
推荐指数
1
解决办法
3350
查看次数